我尝试做以下事情:
JFrame
BorderLayout
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"));
}
}
结果:
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();
}
}
结果:
我尝试添加validate();
和repaint();
,但这无济于事。这里出了什么问题?
答案 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();
}
}