我有一个外部JPanel,其中包含一个内部面板列表。 我的布局是 GridLayout
在某些情况下,我想隐藏一些内部面板。问题是,在我对某些内部面板执行setVisible(false)之后,它们确实消失了,但是它们以前的占用空间仍然保留并且没有被擦除,因此会创建空白。
如何删除这些空白并使所有可见的内部面板一个接一个地排序,而彼此之间没有任何空白?
outerPanel.setLayout(new GridLayout(4, 1));
outerPanel.add(pnl1);
outerPanel.add(pnl2);
outerPanel.add(pnl3);
outerPanel.add(pnl4);
private void invisibleSome(){
Component[] cmpts = outerPanel.getComponents();
for(int i = 0; i< cmpts.length; i++){
//this make some components invisible
//but their white space still remains
cmpts[i].setVisible(i%2 == 0);
}
}
答案 0 :(得分:1)
我使用了 BoxLayout ,问题解决了:
outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
答案 1 :(得分:0)
设置面板的可见性不会将其从网格中删除。
您应该尝试使用以下方法将它们从网格中删除: https://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html#removeLayoutComponent(java.awt.Component)
此后,您可能需要设置单元的首选大小,以使其变得更小,并且两者之间没有空格。 另一种方法是更新下面的所有面板以向上移动一个单元格。
使用第二种方法,将要显示的内容保留在列表中,从列表中删除所需的内容,从布局中删除所有面板,并从列表中构建全新的布局可能会更容易。您要显示的面板。