Java JFrame:cómo analizar de forma recursiva a través de componets (es decir,si el uso de JScrollPane)
-
21-08-2019 - |
Pregunta
Estoy usando TableLayout para mi swing GUI.Inicialmente sólo algunas etiquetas básicas, botones y campos de texto donde se requiera que yo podría más adelante en el acceso:
public Component getComponent(String componentName) {
return getComponent(componentName, this.frame.getContentPane());
}
private Component getComponent(String componentName, Component component) {
Component found = null;
if (component.getName() != null && component.getName().equals(componentName)) {
found = component;
} else {
for (Component child : ((Container) component).getComponents()) {
found = getComponent(componentName, child);
if (found != null)
break;
}
}
return found;
}
Por desgracia me encontré con problemas después de usar JScrollPane
para apoyar el desplazamiento de JTextArea
y JTable, que hice con:
JTextArea ta = new JTextArea();
ta.setName("fooburg");
JScrollPane scr = new JScrollPane(ta);
frame.getContentPane().add(scr, "1, 1"); // EDIT: changed, tkx bruno
Después de las sugerencias, he sido capaz de acceder a través de getComponent("fooburg")
el componente deseado (la versión anterior es la definitiva).Muchas gracias a Dan y Bruno!
Solución
@bruno es correcto -. Es necesario agregar el panel de texto al panel de contenido del frame
Ligeramente OT: Si por lo general desea acceder a todos los componentes de una jerarquía, se necesita algo recursivo - su método actual sólo imprimirá nombres secundarios inmediatos:
void printNames(Component component) {
System.out.println(component.getName());
for (Component child : component.getComponents()) {
printNames(child);
}
}
void printFrameNamesComponents(JFrame frame) {
printNames(frame.getContentPane());
}
(no probado, pero algo como esto.)
Otros consejos
Es necesario añadir que el niño panel de contenido del JFrame lugar:
frame.getContentPane().add(comp);
Si se agrega el nuevo componente a JFrame directamente, por encima de su código nunca se de a ella, ya que sólo está enumerando los componentes bajo frame.getContentPane()
.