2009-06-24 27 views
5

Para inicializar todos JTextfField s en un JPanel cuando los usuarios hacen clic en un "botón de borrar", necesito recorrer el JPanel (en lugar de configurar todos los campos individuales en "").loop a través de JPanel

¿Cómo puedo usar un bucle for-each para recorrer el JPanel en la búsqueda de JTextField s?

Respuesta

15
for (Component c : pane.getComponents()) { 
    if (c instanceof JTextField) { 
     ((JTextField)c).setText(""); 
    } 
} 

Pero si tiene JTextFields más profundamente anidados, se puede usar la siguiente forma recursiva:

void clearTextFields(Container container) { 
    for (Component c : container.getComponents()) { 
     if (c instanceof JTextField) { 
      ((JTextField)c).setText(""); 
     } else 
     if (c instanceof Container) { 
      clearTextFields((Container)c); 
     } 
    } 
} 

Editar: una muestra para Tom Hawtin - tackline sugerencia sería tener lista en su clase de trama:

List<JTextField> fieldsToClear = new LinkedList<JTextField>(); 

y cuando inicializa el texto individual campos, añadir a esta lista:

someField = new JTextField("Edit me"); 
{ fieldsToClear.add(someField); } 

y cuando el usuario hace clic en el botón de borrado, simplemente:

for (JTextField tf : fieldsToClear) { 
    tf.setText(""); 
} 
+0

¿Eso borra los cuadros combinados también? (Podría ser estático, por cierto). –

+0

JComboBox (extiende JComponent) y JTextField (extiende JTextComponent que extiende JComponent) están en dos rutas diferentes – akarnokd

+0

Revisé el origen de JComboBox y no veo ningún lugar donde JComboBox agregue su editor componente a su lista de componentes. – akarnokd

1

Mientras que otra respuesta muestra una forma directa para resolver su problema, su pregunta es lo que implica una solución pobre

Generalmente queremos que las dependencias estáticas entre capas sean de una sola vía. Debería ir por un paquete a través del getCommponents. Casting (asumiendo genéricos) es una manera fácil de ver que algo salió mal.

Por lo tanto, cuando crea los campos de texto para un formulario, agréguelos a la lista para que se borren en una operación clara y agregándolos al panel. Por supuesto, en el código real probablemente haya otras cosas que quieras hacerles a ellos también. En el código real, es probable que desee tratar con modelos (posiblemente Document) en lugar de JComponent s.

+0

+1 para la idea de tener una lista de componentes interesantes – akarnokd

+0

Hola, Muchas gracias. Esto suena impresionante, pero no sabría cómo implementar su solución. Los ejemplos concretos valen 1000 palabras. Muy apreciado. Dallag. –

+0

Y para continuar, una vez probé una solución basada en anotaciones para divertirme. Anoté mis campos en la clase con mi @SaveContent y utilicé un enfoque reflexivo para cargar/guardar el contenido de los componentes anotados. – akarnokd