在Java Swing中从布局隐藏按钮


问题内容

我正在尝试一些非常基本的东西:我列出了5个按钮。它们位于FlowLayout中,通常的想法是,一旦我单击一个,它将消失,而其他应该相应地重新排序。

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

有什么办法可以在隐藏它的同时将Button保留在JPanel中,以便它不会被Layout拾取?

更新::
感谢您提供所有答案,删除按钮的问题在于顺序很重要。我试图解决的问题是在您键入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()。我似乎曾经有过一个问题,但现在我无法重复这个问题。