Pregunta

Tengo un JPanel llena de JTextFields ...

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

¿Fue útil?

Solución

Bueno, ten en cuenta que no llegar 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 referencia a los 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.
}

// Posterior

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

¿No era tan fácil?

Recuerde mantener este tipo de artefactos (lista) lo más privada posible. Ellos son para su control sólo, no creo que pertenecen a la interfaz.

Supongamos que desea obtener el conjunto de textos, en lugar de

 public List<JTextField> getFields();

Debe tener en cuenta:

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

Otros consejos

Cada JPanel en Java es también un contenedor AWT. Por lo tanto, usted debe ser capaz de utilizar getComponents para obtener el conjunto de los componentes contenidos en el panel, iterar sobre ellos, comprobar sus tipos (Para asegurarse de que no recibió otros controles), y hacer lo que tiene con ellos.

Sin embargo, esto es generalmente un mal diseño. Si sabe que va a necesitar para acceder a componentes específicos, es mejor mantener una serie de esos campos de texto y pasarlo alrededor, a pesar de que están contenidos visualmente el interior del recipiente.

Si se trata de una tarea recurrente o se podría hacer desde múltiples puntos, incluso puede tener sentido para tener una clase especial que representa un panel con los campos de texto, que a su vez permitirá a través de sus medios de interfaz de acceso a estos campos.

Usted debe llamar al método getComponents esto devuelve con una matriz de todos los elementos en su JPanel. Después se puede repetir en la matriz y comprobar si es igual con el tratado después de componente.

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

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

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 llama de esta manera

ClearAllFields([jdialog or jframe etc].getContentPane());
    //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);
        }
    }

dinámicamente darle un nombre durante la creación y luego hacerlo.

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }

Su problema es escribir el texto del código 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+")"+";");
}

Pegue 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()"+";");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top