Как получить все элементы внутри JFrame? - PullRequest
17 голосов
/ 27 июня 2011

У меня есть этот код, чтобы получить все необходимые мне элементы и выполнить некоторую обработку. Проблема в том, что мне нужно указать каждую панель, чтобы получить элементы внутри нее.

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 ]

39 голосов
/ 27 июня 2011

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

Этот сайт предоставляет пример кода:

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.

15 голосов
/ 27 июня 2011

Посмотрите на документ для JFrame .Все, что вы помещаете в JFrame, фактически помещается в корневую панель, содержащуюся в кадре.

for (Component c : this.getRootPane().getComponents())    
0 голосов
/ 09 декабря 2016

Если вы хотите найти все компоненты данного типа, то вы можете использовать этот рекурсивный метод!

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);
0 голосов
/ 30 ноября 2016
            for (Component c : mainPanel.getComponents()) {
                for (Component sc : ((JPanel) c).getComponents()) {
                    if (sc instanceof JTextField) {
                        //process
                    }
                }
            }

в моем коде, я просто получаю все экземпляры jtextfield. Вы можете использовать ту же логику. это всего лишь пример получения всех подкомпонентов из взятых вами компонентов. Надеюсь, это поможет тебе.

...