JFrame 上のすべての JPanel に対して setVisible を設定するにはどうすればよいですか? 各パネルに JFrame.JPanel.setVisible を使用できることはわかっていますが、すべてのパネルに使用したいと思います。
ウィッチパネルが見えるか分からないのでとても助かります。したがって、アクション後にすべてのパネルを非表示にし、1 つまたは 2 つのパネルを表示したい。
簡単な解決策:
すべてのパネルをインスタンスとして、またはリストに保存します
一般的な解決策:
ウィジェット ツリーを繰り返す
private void setAllChildPanelsVisible(Container parent) {
Component[] components = parent.getComponents();
if (components.length > 0) {
for (Component component : components) {
if (component instanceof JPanel) {
((JPanel) component).setVisible(true);
}
if (component instanceof Container) {
setAllChildPanelsVisible((Container) component);
}
}
}
}
それの使い方:
@Test
public void testSetAllChildPanelsVisible() {
JFrame frame = new JFrame();
JPanel panel1 = new JPanel();
frame.getContentPane().add(panel1);
JPanel panel2 = new JPanel();
panel1.add(panel2);
panel1.setVisible(false);
panel2.setVisible(false);
assertFalse(panel1.isVisible());
assertFalse(panel2.isVisible());
setAllChildPanelsVisible(frame.getContentPane());
assertTrue(panel1.isVisible());
assertTrue(panel2.isVisible());
}
これを行う一般的な方法を次に示します。コンテナー階層内のすべてのコンポーネントを再帰的に反復し、特定のコンポーネント クラスに一致するコンポーネントを見つけて、それらの visible プロパティを設定します。
static void setComponentVisibility(Container container,
Class<? extends Component> componentClass, boolean visible) {
for (Component c : container.getComponents()) {
if (componentClass.isAssignableFrom(c.getClass())) {
c.setVisible(visible);
} else if (c instanceof Container) {
setComponentVisibility((Container)c, componentClass, visible);
}
}
}
次のように使用します。
setComponentVisibility(frame, JPanel.class, false);