Java JFrame: come analizzare in modo ricorsivo attraverso i componenti (vale a dire se si utilizza JScrollPane)
-
21-08-2019 - |
Domanda
TableLayout per la mia GUI swing. Inizialmente solo alcune etichette di base, i pulsanti e campi di testo per quanto necessario, che ho potuto in seguito l'accesso da:
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;
}
Purtroppo mi sono imbattuto in problemi dopo aver usato utilizzando JScrollPane
per supportare lo scorrimento in JTextArea
e JTable di, che ho fatto con:
JTextArea ta = new JTextArea();
ta.setName("fooburg");
JScrollPane scr = new JScrollPane(ta);
frame.getContentPane().add(scr, "1, 1"); // EDIT: changed, tkx bruno
Dopo suggerimenti, sono stato in grado di accedere attraverso getComponent("fooburg")
il componente desiderato (la versione di cui sopra è quella finale). Molte grazie a Dan e Bruno!
Soluzione
@bruno è giusto -. È necessario aggiungere il riquadro di testo al riquadro del contenuto del frame
Un po 'OT: Se in genere desidera accedere tutti i componenti in una gerarchia, avete bisogno di qualcosa ricorsiva - il metodo corrente stamperà solo i nomi del bambino immediati:
void printNames(Component component) {
System.out.println(component.getName());
for (Component child : component.getComponents()) {
printNames(child);
}
}
void printFrameNamesComponents(JFrame frame) {
printNames(frame.getContentPane());
}
(non testato, ma qualcosa di simile.)
Altri suggerimenti
È necessario aggiungere il bambino a riquadro del contenuto del JFrame invece:
frame.getContentPane().add(comp);
Se si aggiunge il nuovo componente di JFrame direttamente, il tuo codice di cui sopra non arrivano mai di esso perché si sta enumerazione solo i componenti in frame.getContentPane()
.