fillers - layouts java swing
Java obtener componentes de JPanel (6)
Tengo un JPanel lleno de JTextFields ...
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField);
}
¿Cómo obtengo los JTextFields en ese JPanel? Me gusta si quiero sus valores con
TextField.getText();
Gracias
Bien, tengan en cuenta que no llegaron allí por sí mismos (creo que leí algunas preguntas sobre la creación dinámica de estos paneles en tiempo de ejecución)
En las respuestas publicadas allí, alguien dijo que debería mantener la referencia a esos campos de texto en una matriz. Eso es exactamente lo que necesitas 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.
}
// Luego
for( JTextField f : list ) {
System.out.println( f.getText() ) ;
}
¿No fue 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.
Supongamos que desea obtener la matriz de textos, en lugar de
public List<JTextField> getFields();
Deberías considerar:
public List<String> getTexts(); // get them from the textfields ...
Cada JPanel en Java también es 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 pobre. 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 múltiples 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 los medios para acceder a estos campos.
//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);
}
}
Debería llamar al método getComponents que devuelve con una matriz de todos los elementos en su 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);
}
}
Tu problema es escribir el texto del código tedioso. ¿Por qué no solo generarlo 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 listo. Ahora, para acceder al contenido de los campos de texto, puede generar el texto del código tedioso de una manera similar ...
for(int i=1 ; i<=maxpoints ;i++){
System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
Esto es lo que hice para recursivamente ir a través del contenedor y obtener los campos de texto que están 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 luego para usarlo, lo llamas de esta manera
ClearAllFields([jdialog or jframe etc].getContentPane());