首页 > 解决方案 > JFrame 中的 JPanel 有时不显示内容。为什么?

问题描述

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

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

我只是连续尝试了 10 次,并且这些元素仅在第 4 次尝试时可见。

这可能来自以前执行代码时剩余的一些内存垃圾吗?

我正在使用 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);
    }
}

标签: javaswingjframejpanelvisibility

解决方案


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

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

此外,所有的 GUI 组件都应该在 上创建Event Dispatch Thread (EDT),否则您可能会得到随机结果。阅读 Swing 教程中关于并发的部分以获取更多信息。

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

在我调整窗口大小之前,它们不会可见,

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

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

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

本教程还包含Layout Managers您应该阅读的部分。


推荐阅读