【问题标题】:Swing - After setVisible(false) space remainsSwing - 在 setVisible(false) 空间仍然存在之后
【发布时间】:2019-06-02 12:20:23
【问题描述】:

我有一个外部 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);
   }
}

【问题讨论】:

  • 删除组件后忘记调用repaint()revalidate()
  • @HovercraftFullOfEels GridLayout 在组件可见后不会正确地revalidate()。我认为它也会起作用,但它没有。
  • @HovercraftFullOfEels 不,我不会忘记那些,试试 GridLayout,你会看到会发生什么
  • 我得到负分的问题有什么问题?我觉得很有用

标签: java swing layout-manager grid-layout


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我知道这一点,但我不想删除它们。有什么方法可以不删除它吗?
    • 我不太确定这是否可行,但您可以尝试将单元格的最大高度设置为 0 或 1。因此它不会真正被删除,但只会显示在 1 个像素上.如果使用 GridLayout 不起作用,可以尝试 MigLayout,它更强大(以及 eclipse 和 window-builder 中的默认布局)
    • 我试试 MigLayout
    • 谢谢,我使用了 BoxLayout,我的问题解决了。对了,我没有给你负分,我不知道是谁干的……他们也给了我2分
    猜你喜欢
    • 2015-07-23
    • 2011-12-10
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多