如何获取JFrame中的所有元素?

我有这个代码来获取我需要的所有元素并进行一些处理。 问题是我需要指定每个面板来获取其中的元素。

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 

我想做这样的事情,并获得所有的元素,而不需要specefy所有的面板名称。 我是怎么做到的 下面的代码没有获得所有元素。

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

您可以编写递归方法并对每个容器进行递归:

该站点提供了一些示例代码:

 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; } 

如果只需要直接子组件的组件,则可以将递归深度限制为2。

查看JFrame的doc。 放在JFrame内容实际上都放在框架中包含的根窗格中。

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

在我的代码中,我只是获取jtextfield的所有实例。 你可以使用相同的逻辑。 这只是从您采取的组件中获取所有子组件的示例。 希望它会帮助你。

如果要查找给定类型的所有组件,则可以使用此递归方法!

 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()); } 

它可以像这样使用:

 // 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);