如何在jframe中获取所有元素?

7ajki6be  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(354)

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

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

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

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

6ojccjat1#

看看jframe的文档。所有你放在 JFrame 实际上放在框架中包含的根窗格中。

for (Component c : this.getRootPane().getComponents())
a2mppw5e

a2mppw5e2#

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

public static <T extends JComponent> List<T> findComponents(
    final Container container,
    final Class<T> 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);
kxxlusnw

kxxlusnw3#

您可以编写递归方法并在每个容器上递归:
本网站提供了一些示例代码:

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

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

wb1gzix0

wb1gzix04#

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

在我的代码中,我只是得到jtextfield的所有示例。你可以用同样的逻辑。这只是一个从您所使用的组件中获取所有子组件的示例。希望它能帮助你。

相关问题