代码之家  ›  专栏  ›  技术社区  ›  Tigraine

在JavaSwing中隐藏布局中的按钮

  •  1
  • Tigraine  · 技术社区  · 15 年前

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

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

    有没有办法在隐藏按钮的同时将其保留在JPanel中,这样它就不会被布局拾取?

    更新:

    4 回复  |  直到 15 年前
        1
  •  6
  •   camickr    15 年前

    对我来说很好。

    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()。我似乎曾经有过一个问题,但现在我无法复制这个问题。

        2
  •  2
  •   OscarRyz    15 年前

    只需删除它:

     panel.remove( button );
    

    布局管理器被认为恰恰是为了避免“用户”为了让每个组件都在正确的位置而耍花招(尽管这似乎会引起相反的效果)

    从面板上卸下按钮将产生重新布置所有剩余组件的效果。这就是为什么它的名称是“布局管理器”,它管理着为您布局组件。

        3
  •  1
  •   Michael Borgwardt    15 年前

    我认为有两种可能性:

    • 编写自己的布局管理器,以侦听对其子级布局的更改 visible 属性-不应该太难,您可能可以创建子类 FlowLayout 去做吧。
        4
  •  0
  •   Carl Smotricz    15 年前

    您可以覆盖每个按钮的 getPreferredSize() 方法(以及可能的方法) getMinimumSize() invalidate() (或 revalidate validate ,我永远也不能把它们放在容器上。