Как получить все элементы внутри 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

Я хочу сделать что-то вроде этого и получить все элементы без необходимости указывать все имена панелей. Как я это делаю. Код ниже не получает все элементы.

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

4 ответов


вы можете написать рекурсивный метод и рекурсия на каждом контейнере:

этот сайт содержит пример кода:

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.


посмотрите на doc для JFrame. Все, что вы кладете в 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 <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);