2011-02-18 47 views
7

Estoy buscando una forma de poner texto de ejemplo en un swing JTextField y tenerlo atenuado. El texto de ejemplo debería desaparecer tan pronto como se ingrese algo en ese campo de texto. Algo similar a lo que stackoverflow hace cuando un usuario está publicando una pregunta con el campo de título.Texto de ejemplo en JTextField

Me gustaría que ya fuera una implementación extendida de JTextField para que pueda simplemente colocarlo como un simple reemplazo. Cualquier cosa de swingx funcionaría. Supongo que si no hay una manera fácil de hacer esto, mi opción probablemente sea anular el método de pintura de JTextField para hacer algo así.

Gracias

Respuesta

7

La clase Text Prompt proporciona la funcionalidad requerida sin necesidad de utilizar una costumbre JTextField.

2

En lugar de primer orden, poner un valor en el campo y añadir un KeyListener que eliminaría el valor cuando se ha registrado una pulsación de tecla. Quizás también tenga que cambiar el primer plano.

Puede envolver esto en su propia clase personalizada JTextField que tomaría el texto predeterminado en un constructor.

+0

No puede usar un detector de teclas ya que los datos pueden ingresarse por otros métodos como copiar y pegar. –

+0

No agregaría realmente este texto de ejemplo en el campo de valor ya que existe el riesgo de utilizar getText() recuperando ese texto de ejemplo – dm76

+0

@Hover, pensé en un oyente de enfoque primero, pero en el ejemplo de título SO que el OP mencionado como ejemplo, el texto no desaparece en el enfoque, sino que cuando se comienza a escribir. Si permitiera pegar un agregar un DocumentListener podría ser una mejor solución. – jzd

1

No puede hacer eso con un campo de texto sin formato, pero puede poner un JLabel deshabilitado encima del JTextField y ocultarlo si el campo de texto obtiene el foco.

5

Si puede utilizar librairies externos, los componentes Swing de Jide software tienen lo que está buscando; se llama LabeledTextField (javadoc) y es parte de la capa común de JIDE (Open Source Project), que es gratuita. Está haciendo lo que sugirió mklhmnn.

+0

¡Publicación muy útil! 1+ –

3

¿Qué hay de inicializar el campo de texto con el texto predeterminado y darle un oyente de enfoque de modo que cuando se gana el foco, si el texto es igual al texto predeterminado, llame a SelectAll() en el JTextField.

1

hacerlo de esta manera:

  1. Definir la cadena con el texto inicial que le gusta y configurar su campo de texto:

    String initialText = "Enter your initial text here"; 
    jTextField1.setText(initialText); 
    
  2. Añadir un enfoque oyente a su campo de texto, que selecciona la todo el contenido de TextField si todavía tiene el valor inicial. Todo lo que ingrese reemplazará todo el contenido, ya que está seleccionado.

    jTextField1.addFocusListener(new java.awt.event.FocusAdapter() { 
        public void focusGained(java.awt.event.FocusEvent evt) { 
         if (jTextField1.getText().equals(initialText)) { 
          jTextField1.selectAll(); 
         } 
        } 
    }); 
    
+0

Es exactamente lo que sugirió Hovercraft. Estaba ocupado pegando y no leí su respuesta. –

2
private JLabel l; 

JPromptTextField(String prompt) { 
    l = new JLabel(prompt, SwingConstants.CENTER); 
    l.setForeground(Color.GRAY); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    if (this.getText().length() == 0) { 
     // Reshape the label if needed, then paint 

     final Rectangle mine = this.getBounds(); 
     final Rectangle its = l.getBounds(); 
     boolean resized = (mine.width != its.width) || (mine.height != its.height); 
     boolean moved = (mine.x != its.x) || (mine.y != its.y); 
     if (resized || moved) 
      l.setBounds(mine); 

     l.paint(g); 
    } 
} 
+0

no, nunca, no cree lo que sea dentro paintComponent, no JComponents, todos los objetos deben estar preparados, solo para invocar los métodos gráficos/2D, nunca nunca para cambiar sus propiedades – mKorbel

+0

@mKorbel: ¿por qué? ¿Puedes elaborar o dar una referencia? – ignis

+1

bacause paintComponent se llaman 1. internamente cuando se requiere JComponent para repaint(), 2. después de repintar llamada(), 3. de cada mouse y eventos de teclado, 4. cuando la jerarquía o el contenedor (agregar JComponents, resize ei) se cambian o se activan eventos programáticamente, 5. debería estar hasta latencia en el sistema operativo nativo (sobrecargando esta proporción de actualización para congelar la pintura), 6 cada uno o este evento para crear un nuevo JLabel, tener que calcular también con OutOfMemoryExceptions, 7, el mismo problema no carga la imagen desde este bloque, prepárelo como variable local y solo desde el array o por nombre de variable – mKorbel

Cuestiones relacionadas