gpt4 book ai didi

java - JFrame 中的 JPanel 有时不显示内容。为什么?

转载 作者:行者123 更新时间:2023-12-02 10:45:47 25 4
gpt4 key购买 nike

我设法修复了它,但我不明白为什么相同的代码会产生不同的结果。有些同学也遇到了同样的问题。

问题是我在 chicha(); 之前使用 miVentana.setVisible(true); JPanel 内的元素将在执行时显示,但如果我运行它有时,在我调整窗口大小之前,它们不会可见,有几次甚至 JPanel 背景颜色都不可见。只需单击 IDE 上的“运行”底部即可,无需更改任何其他内容。

我刚刚连续尝试了 10 次,并且元素仅在第四次尝试时可见。

这可能是由于之前执行代码时留下的一些内存垃圾造成的吗?

我正在使用 Eclipse 版本:Photon Release (4.8.0)。

这是具有奇怪行为的代码:

public class Ej10 extends JFrame {

public Ej10() {
setLayout(null);
}

static Ej10 miVentana = new Ej10();

public static void main(String[] args) {
miVentana.setTitle("Ejercicio10");
miVentana.setBounds(20, 20, 500, 600);
miVentana.setLocationRelativeTo(null);

miVentana.setVisible(true);

chicha();
//miVentana.setVisible(true);

}

static void chicha() {
JPanel miPanel = new JPanel();
miPanel.setLayout(new BoxLayout(miPanel, BoxLayout.PAGE_AXIS));
miPanel.setBounds(20, 20, 350, 450);
miPanel.setBackground(Color.CYAN);

JLabel lUsuario = new JLabel("Usuario:");
lUsuario.setVisible(true);
JTextField campoUsuario = new JTextField();
JLabel lPwd = new JLabel("Contraseña:");
JPasswordField campoPwd = new JPasswordField();
JButton bAcceso = new JButton("Acceder");

miPanel.add(lUsuario);
miPanel.add(campoUsuario);
miPanel.add(lPwd);
miPanel.add(campoPwd);
miPanel.add(bAcceso);

miPanel.setVisible(true);
miVentana.add(miPanel);
}
}

最佳答案

需要在框架可见之前将组件添加到框架中。

setVisible() 方法的功能之一是调用布局管理器。否则,组件的 size() 为 (0, 0),因此无需绘制任何内容。

此外,所有 GUI 组件都应在事件调度线程 (EDT) 上创建,否则您可能会得到随机结果。阅读 Swing 教程中关于 Concurrency 的部分了解更多信息。

看看 How to Make Frames 中的 FrameDemo有关如何构建代码以避免问题的最基本示例。它展示了如何在 EDT 上创建组件以及如何使框架可见。

they won't ve visible until I resize the window,

调整框架大小也会导致调用布局管理器。

miPanel.setBounds(20, 20, 350, 450);

该语句不会执行任何操作,因为框架的布局管理器将根据布局管理器的规则确定面板的大小和位置。框架的默认布局管理器是 BorderLayout,因此基本上面板将获得框架的所有可用空间。

本教程还有一个关于布局管理器的部分,您应该阅读。

关于java - JFrame 中的 JPanel 有时不显示内容。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52595917/

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