在Java Swing中隐藏布局中的按钮

我正在尝试一些非常基本的东西:我有一个5个按钮列表。 它们在FlowLayout中,一般的想法应该是,一旦我点击一个它应该消失,其他人应该相应地重新排序。

现在,如果我调用setVisible(false)按钮变得不可见,但它仍然占据了Layoutmanager中的空间。

是否有任何方法可以将Button保留在JPanel中,同时隐藏它以便它不会被布局拾取?

更新::感谢所有答案,删除按钮的问题是订单很重要。 我试图解决的问题是当你键入szenario时发现一个很长的按钮列表被过滤到与输入的字符匹配的按钮,这样用户就可以轻松点击它们。 由于用户可以从搜索字段中删除字符,因此排序很重要,按钮必须再次匹配时才会弹出。

对我来说很好。

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlowLayoutInvisible extends JFrame implements ActionListener { JPanel north; int i; public FlowLayoutInvisible() { north = new JPanel(); for (int i = 0; i < 5; i++) { JButton button = new JButton("North - " + i); button.addActionListener(this); north.add(button); } getContentPane().add(north, BorderLayout.NORTH); } public void actionPerformed(ActionEvent e) { Component c = (Component)e.getSource(); c.setVisible(false); ((JPanel)c.getParent()).revalidate(); } public static void main(String[] args) { FlowLayoutInvisible frame = new FlowLayoutInvisible(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } } 

如果您需要更多帮助,请发布您的SSCCE 。

更新:我不知道是否需要revalidate()。 我似乎有一个问题,但现在我无法复制问题。

只需删除它:

  panel.remove( button ); 

这个选项出了什么问题?

布局管理器被认为是为了避免让“用户”制作技巧以使每个组件成为正确的位置(尽管它似乎会产生相反的效果)

从面板上卸下按钮将产生再次布置所有剩余组件的效果。 这就是为什么它的名字是“布局管理器”,它设法为你布局组件。

我看到两种可能性:

  • 编写自己的布局管理器来监听其子FlowLayoutvisible属性的更改 – 不应该太难,你可以FlowLayout子类FlowLayout来做它。
  • 实际上从面板中删除单击按钮,如有必要,稍后重新添加。

您可以覆盖每个按钮的getPreferredSize()方法(以及可能的getMinimumSize()以及当组件不可见时返回0,0;并且您需要调用,我认为, invalidate() (或revalidatevalidate ,我永远不能保持他们直接)在容器上。