Swing - 在 setVisible(false) space 之后仍然存在

Swing - After setVisible(false) space remains

我有一个外部 JPanel,其中包含一个内部面板列表。 我的布局是 GridLayout

在某些情况下,我想隐藏一些内部面板。问题是,在我对一些内部面板执行 setVisible(false) 之后,它们确实消失了,但它们之前被占用 space 仍然存在并且不会消失,因此它会创建白色 spaces .

如何去除那些白色的 space 并使所有可见的内部面板一个接一个地排序,而它们之间没有任何白色 space?

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);
   }
}

设置面板的可见性不会将它们从您的网格中移除。

您应该尝试使用以下方法将它们从网格中删除: https://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html#removeLayoutComponent(java.awt.Component)

之后,您可能必须设置单元格的首选大小,使其变得更小,并且两者之间没有空白 space。 另一种方法是更新下面的所有面板以向上移动一个单元格。

使用第二种方法可能更容易将您想要显示的那些保留在列表中,从列表中删除您想要的,从布局中删除所有面板并从中构建一个全新的布局您要显示的面板列表。

我使用了 BoxLayout 我的问题解决了 :

outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));