2008-12-16 76 views
14

tengo un JPanel llena de JTextFields ...Java Ver Componentes JPanel

for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField(); 
    points.add(textField); 
} 

¿Cómo llego tarde los JTextFields en que JPanel? Al igual que si quiero sus valores con

TextField.getText(); 

Gracias

+0

Tengo que decir, gracias "nadie" para eliminar los logotipos de manzana y el "thanksss" firmar. –

Respuesta

11

bien tener en cuenta que no llegan allí por ellos mismos (creo que a Lea algunas preguntas acerca de la creación dinámica de estos paneles en tiempo de ejecución)

En las respuestas publicadas allí, alguien dijo que debe mantenerse la referencia a las campos de texto en una matriz. Eso es exactamente lo que necesita aquí:

List<JTextField> list = new ArrayLists<JTextField>(); 

// your code... 
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField(); 
    points.add(textField); 
    list.add(textField); // keep a reference to those fields. 
} 

// Más tarde

for(JTextField f : list) { 
    System.out.println(f.getText()) ; 
} 

no era tan fácil?

Solo recuerde mantener este tipo de artefactos (lista) lo más privado posible. Son solo para su control, no creo que pertenezcan a la interfaz.

Digamos que usted quiere conseguir la variedad de textos, en lugar de

public List<JTextField> getFields(); 

Debe tener en cuenta:

public List<String> getTexts(); // get them from the textfields ... 
10

Cada JPanel en Java es también un contenedor AWT. Por lo tanto, debería poder usar getComponents para obtener la matriz de componentes contenidos en el panel, iterar sobre ellos, verificar sus tipos (para asegurarse de que no recibió otros controles) y hacer lo que necesite con ellos.

Sin embargo, este es generalmente un diseño deficiente. Si sabe que necesitará acceder a componentes específicos, es mejor mantener una matriz de esos campos de texto y pasarlos, aunque estén contenidos visualmente dentro del contenedor.

Si se trata de una tarea recurrente o se puede hacer desde varios puntos, incluso puede tener sentido tener una clase especial que represente un panel con campos de texto, que luego proporcionará a través de su interfaz el acceso a estos campos.

1
//una forma de recorer todos los elementos dentro de un jpanel 
    Component[] components = jPanelX.getComponents(); 

    for (int i = 0; i < components.length; i++) { 

     if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){ 
      components[i].setEnabled(false); 
     } 
    } 
+1

¿Es posible obtener este componente con su nombre declarado? Me refiero al nombre de la variable del componente – Barrier

2

Usted debe llamar al método getComponents este regresa con una serie de todos los elementos en tu JPanel. Luego puede iterar en la matriz y verificar si es igual al componente buscado.

List<JTextField> list = new ArrayLists<JTextField>(); 
Component[] components = panel.getComponents(); 

for (Component component : components) { 
    if (component.getClass().equals(JTextField.class)) { 
     list.add((JTextField)component); 
    } 
} 
+0

¿es posible obtener este componente con su nombre declarado? Me refiero al nombre de la variable del componente. – Barrier

0

Tu problema es escribir el código del texto tedioso. ¿Por qué no acaba de generar y pegarlo en el programa !! ...

for(int i=1 ; i<=maxpoints ;i++){ 
    System.out.println("JTextField tf"+i+" = new JTextField()"+";"); 
    System.out.println("points.add(tf"+i+")"+";"); 
} 

pega el resultado del código anterior en su programa y ya está. Ahora, para acceder al contenido de los campos de texto que puede generar el texto tediosos códigos de una manera similar ....

for(int i=1 ; i<=maxpoints ;i++){ 
    System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";"); 
} 
1

Esto es lo que hice para ir de forma recursiva a través del contenedor y obtener los campos de texto que se encuentran en los JPanels.

private void ClearAllFields(Container myContainer) { 

    Component myComps[] = myContainer.getComponents(); 

    for (int i=0; i<myComps.length; i++) { 
     if(myComps[i] instanceof JPanel) { 
      JPanel myPanel = (JPanel) myComps[i]; 
      ClearAllFields(myPanel); 
     } 
     if(myComps[i] instanceof JTextField) { 
     JTextField myTextField = (JTextField) myComps[i]; 
     myTextField.setText(""); 
     } 
    }   
} 

Y después de usarlo, se llaman de esta manera

ClearAllFields([jdialog or jframe etc].getContentPane()); 
Cuestiones relacionadas