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

Java BorderLayout-添加另一个组件后,子组件仍然可见,java,swing,jframe,layout-manager,border-layout,Java,Swing,Jframe,Layout Manager,Border Layout,我试着做以下事情: 使用边框布局将组件添加到JFrame 将另一个组件添加到JFrame 我希望新组件“覆盖”旧组件,因为我使用的是BorderLayout。如果我在调用pack()之前覆盖了旧组件,则此操作有效。现在,如果在调用pack()之后添加第二个组件,两个组件都将保持可见。例如: public class Test extends JFrame{ public Test(){ setLayout(new BorderLayout()); add(

我试着做以下事情:

  • 使用
    边框布局将组件添加到
    JFrame
  • 将另一个组件添加到
    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();
        }
    }
    
    结果:

    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()
    重新绘制(),但那没用。这里怎么了

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

    您可以尝试
    getComponents()[0]=newjlabel(“另一个文本”)
    JFrame
    s,
    frame.getContentPane().add
    相当于
    frame.add()
    是的,事实证明,您可以从上面删除getContentPane()。没有必要在内容窗格上设置borderLayout,这是它的默认设置…好吧,早在我高中的时候,我们对所有lol都使用空布局。从那以后,它就永远让我瘫痪了。@rcook谢谢你的反馈。在构造函数中执行所有操作只是为了示例:)但是,在我的示例中,我需要在setVisible()之后添加内容。我现在唯一能让它工作的方法是,在添加新组件之前,手动从布局中删除中心组件:BorderLayout l=new BorderLayout()。。。getContentPane().remove(l.getLayoutComponent(BorderLayout.CENTER));