gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:23:57 25 4
gpt4 key购买 nike

我尝试做以下事情:

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

结果: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();,但这没有帮助。这里出了什么问题?

最佳答案

在调用 setViisble() 后,您正在调用影响 UI 的内容——这是 Swing 的禁忌。将影响UI的东西放入invokeLater调用中;查一下。

当您这样做时,我认为您仍然应该从框架中获取内容 Pane 以添加组件...并且我认为在构造函数中创建内容不是一个好主意。

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

关于java - BorderLayout - 添加另一个组件后子组件仍然可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com