我有这个代码来获取我需要的所有元素并进行一些处理。问题是我需要指定每个面板来获取其中的元素。
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
}
答案 0 :(得分:39)
您可以编写递归方法并递归每个容器:
This site提供了一些示例代码:
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.
答案 1 :(得分:14)
查看JFrame的文档。
放在JFrame
中的所有内容实际上都放在框架中包含的根窗格中。
for (Component c : this.getRootPane().getComponents())
答案 2 :(得分:0)
data.translate
在我的代码中,我只是获取jtextfield的所有实例。你可以使用相同的逻辑。这只是从您采取的组件中获取所有子组件的示例。希望它会帮助你。
答案 3 :(得分:0)
如果要查找给定类型的所有组件,则可以使用此递归方法!
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);