【问题标题】:BorderLayout - child component remains visible after adding another componentBorderLayout - 添加另一个组件后子组件仍然可见
【发布时间】:2013-09-10 23:40:38
【问题描述】:

我尝试做以下事情:

  1. 使用BorderLayout 将组件添加到JFrame
  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"));
    }
}

结果:

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();,但这无济于事。这里出了什么问题?

【问题讨论】:

  • 你可以试试getComponents()[0] = new JLabel("Another Text");

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


【解决方案1】:

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

【讨论】:

  • 我很确定JFrames,frame.getContentPane().add 等同于frame.add()
  • 是的,事实证明,您可以从上面删除 getContentPane()。并且不需要在内容窗格上设置borderLayout,这是它的默认设置...
  • 嗯,在我上高中的时候,我们对所有内容都使用了 null 布局,哈哈。从那以后它就永远残废了。
  • @rcook 感谢您的反馈。在构造函数中做所有事情只是为了示例:) 但是,在我的情况下,我需要在 setVisible() 之后添加内容。我现在让它工作的唯一方法是在添加新组件之前从布局中手动删除 CENTER 组件: BorderLayout l = new BorderLayout(); ... getContentPane().remove(l.getLayoutComponent(BorderLayout.CENTER));
猜你喜欢
  • 2013-05-24
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多