如何获取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);