BorderLayout - 添加另一个组件后,子组件仍然可见

时间:2013-09-06 19:22:36

标签: java swing jframe layout-manager border-layout

我尝试做以下事情:

  1. 使用JFrame
  2. 将组件添加到BorderLayout
  3. 将另一个组件添加到JFrame
  4. 我希望新组件“覆盖”旧组件,因为我使用的是BorderLayout。如果我在调用pack()之前覆盖旧组件,则此方法有效。现在如果我在之后添加第二个组件,我会调用pack(),这两个组件仍然可见。例如:

    public class Test extends JFrame{
        public Test(){
            setLayout(new BorderLayout());
            add(new JLabel("Quite a long text"));
            setVisible(true);
            pack();
            add(new JLabel("Another text"));
        }
    }
    

    结果:Calling pack() before adding the component

    public class Test extends JFrame{
        public Test(){
            setLayout(new BorderLayout());
            add(new JLabel("Quite a long text"));
            setVisible(true);
            add(new JLabel("Another text"));
            pack();
        }
    }
    

    结果:Calling pack() after adding the component

    我尝试添加validate();repaint();,但这无济于事。这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

调用setViisble()后,您正在调用影响UI的内容 - Swing禁止。将影响UI的内容放入invokeLater调用中;查一查。

当你在这里时,我认为你仍然应该从框架中获取内容窗格以添加组件......我不认为在构造函数中创建东西是个好主意。

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class SwingTest extends JFrame
{
    public void createUI()
    {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        SwingUtilities.invokeLater(
                new Runnable()
                {
                    public void run()
                    {
                        getContentPane().setLayout(new BorderLayout());
                        getContentPane().add(new JLabel("Quite a long text"), BorderLayout.CENTER);
                        getContentPane().add(new JLabel("Another text"), BorderLayout.CENTER);
                        pack();
                        setVisible(true);
                    }
                }
                );
    }

    public static void main(String ... args) 
    { 
        SwingTest st = new SwingTest();
        st.createUI();
    }
}