从BoxLayout中删除时组件不会移位

时间:2011-07-27 13:16:14

标签: java swing boxlayout

我正在使用BoxLayout并动态删除组件,如下所示:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            final JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
            final JLabel l = new JLabel("remove");
            frame.add(l);
            frame.add(new JLabel("Hello2"));
            frame.add(new JLabel("Hello3"));
            frame.pack();
            frame.setVisible(true);

            new Thread() {
                public void run() {
                    Utils.sleep(1000);
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            frame.remove(l);
                            frame.repaint();
                        }
                    });
                }
            }.start();
        }
    });
}

但是,这样做时,即使从布局中删除了有问题的标签,其他组件也不会向上移动以覆盖其空间,直到我调整框架大小。我在移除组件后尝试重新绘制框架,但没有运气 - 标签不再显示,但仍然存在以前的差距。

除了每次移除组件时自动调整窗口大小的明显可怕的躲避,我如何获得所需的行为?

2 个答案:

答案 0 :(得分:4)

您还需要在frame上调用validate()


SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        frame.remove(l);
        frame.validate();
        frame.repaint();
    }
});

答案 1 :(得分:4)

1 / put revalidate();在repaint()之前;

2 /更好会从Thread调用Runnable而不是invokeLater()