Как получить все элементы внутри 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
}
Ответы
Ответ 1
Вы можете написать рекурсивный метод и рекурсию в каждом контейнере:
Этот сайт содержит пример кода:
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.
Ответ 2
Посмотрите на документ для JFrame.
Все, что вы помещаете в JFrame
, фактически помещается в корневую панель, содержащуюся в кадре.
for (Component c : this.getRootPane().getComponents())
Ответ 3
for (Component c : mainPanel.getComponents()) {
for (Component sc : ((JPanel) c).getComponents()) {
if (sc instanceof JTextField) {
//process
}
}
}
в моем коде, я просто получаю все экземпляры jtextfield. u может использовать ту же логику. это всего лишь пример получения всех подкомпонентов из ваших компонентов. Надеюсь, это поможет вам.
Ответ 4
Если вы хотите найти все компоненты данного типа, вы можете использовать этот рекурсивный метод!
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);