必要なすべての要素を取得して処理を行うためのこのコードがあります。問題は、パネル内の要素を取得するために必要なすべてのパネルを指定する必要があることです。
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
}
再帰メソッドを記述して、すべてのコンテナで再帰することができます。
このサイト いくつかのサンプルコードを提供します:
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に制限できます。
JFrame のドキュメントを見てください。 JFrame
に入れたものはすべて、実際にはフレームに含まれているルートペインに配置されます。
for (Component c : this.getRootPane().getComponents())
特定のタイプのすべてのコンポーネントを検索する場合は、この再帰的な方法を使用できます。
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);
for (Component c : mainPanel.getComponents()) {
for (Component sc : ((JPanel) c).getComponents()) {
if (sc instanceof JTextField) {
//process
}
}
}
私のコードでは、jtextfieldのすべてのインスタンスを取得しています。 uは同じロジックを使用できます。これは、取得したコンポーネントからすべてのサブコンポーネントを取得する例にすぎません。それがあなたを助けることを願っています。