1

我尝试做以下事情:

  1. 使用 a 将组件添加到JFrameaBorderLayout
  2. 将另一个组件添加到JFrame

我希望新组件能够“覆盖”旧组件,因为我使用的是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"));
    }
}

结果:在添加组件之前调用 pack()

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();
    }
}

结果:添加组件后调用 pack()

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

4

1 回答 1

0

在调用 setViisble() 之后,您正在调用影响 UI 的东西—— Swing no-no。将影响 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();
    }
}
于 2013-09-06T19:31:38.807 回答