2013-02-17 34 views
3

如何爲JFrame上的所有JPanel設置可見性? 我知道我可以爲每個面板使用JFrame.JPanel.setVisible,但我想爲所有人做它。如何爲JFrame上的所有JPanel設置可見性

這是非常有用的,因爲我不知道女巫面板是可見的。所以我想在操作後隱藏所有面板並顯示1或2個面板。

回答

1

這是一個通用的方法。它通過在容器層次結構中所有組件recurively迭代,查找符合特定組件類的那些,並設置其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); 
+0

謝謝,非常有用的方法 – 110precent 2013-02-17 18:20:11

4

簡單的解決方案

存儲您的所有面板的情況下,或在列表

通用的解決方案

遍歷控件樹

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()); 
} 
+0

謝謝你您的全面答案。 – 110precent 2013-02-17 17:12:58

相關問題