Come ottenere tutti gli elementi all’interno di un JFrame?

Ho questo codice per ottenere tutti gli elementi di cui ho bisogno e fare qualche elaborazione. Il problema è che ho bisogno di specificare ogni pannello che ho per ottenere gli elementi al suo interno.

for (Component c : panCrawling.getComponents()) { //processing } for (Component c : panFile.getComponents()) { //processing } for (Component c : panThread.getComponents()) { //processing } for (Component c : panLog.getComponents()) { //processing } //continue to all panels 

Voglio fare qualcosa di simile e ottenere tutti gli elementi senza bisogno di specificare tutti i nomi dei pannelli. Come faccio questo Il codice qui sotto non ha tutti gli elementi.

 for (Component c : this.getComponents()) { //processing } 

Puoi scrivere un metodo ricorsivo e recurse su ogni contenitore:

Questo sito fornisce alcuni esempi di codice:

 public static List getAllComponents(final Container c) { Component[] comps = c.getComponents(); List compList = new ArrayList(); for (Component comp : comps) { compList.add(comp); if (comp instanceof Container) compList.addAll(getAllComponents((Container) comp)); } return compList; } 

Se si desidera solo i componenti dei sottocomponenti immediati, è ansible limitare la profondità di ricorsione a 2.

Guarda il documento per JFrame . Tutto ciò che inserisci in un JFrame viene effettivamente inserito in un riquadro radice contenuto nel frame.

 for (Component c : this.getRootPane().getComponents()) 
  for (Component c : mainPanel.getComponents()) { for (Component sc : ((JPanel) c).getComponents()) { if (sc instanceof JTextField) { //process } } } 

nel mio codice, sto solo ottenendo tutte le istanze di jtextfield. puoi usare la stessa logica questo è solo un esempio di come ottenere tutti i componenti secondari dai componenti che hai preso. Spero ti possa aiutare.

Se si desidera trovare tutti i componenti di un determinato tipo, è ansible utilizzare questo metodo ricorsivo!

 public static  List findComponents( final Container container, final Class componentType ) { return Stream.concat( Arrays.stream(container.getComponents()) .filter(componentType::isInstance) .map(componentType::cast), Arrays.stream(container.getComponents()) .filter(Container.class::isInstance) .map(Container.class::cast) .flatMap(c -> findComponents(c, componentType).stream()) ).collect(Collectors.toList()); } 

e può essere usato in questo modo:

 // list all components: findComponents(container, JComponent.class).stream().forEach(System.out::println); // list components that are buttons findComponents(container, JButton.class).stream().forEach(System.out::println);