Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame内部的JPanel不';有时我不会显示内容。为什么?_Java_Swing_Jframe_Jpanel_Visibility - Fatal编程技术网

Java JFrame内部的JPanel不';有时我不会显示内容。为什么?

Java JFrame内部的JPanel不';有时我不会显示内容。为什么?,java,swing,jframe,jpanel,visibility,Java,Swing,Jframe,Jpanel,Visibility,我设法修复了它,但我不明白为什么相同的代码会导致不同的结果。有些同学也有同样的问题 问题是我使用的是miVentana.setVisible(true)在chicha()之前执行时将显示JPanel中的元素,但如果我再次运行它,有时在调整窗口大小之前,它们将不可见,有时甚至连JPanel背景色都不可见。只需单击IDE上的“运行”底部,而无需更改任何其他内容 我只是连续尝试了10次,元素只有在第4次尝试时才可见 这可能来自以前执行代码时留下的内存垃圾吗 我使用的是Eclipse版本:光子发行版(4

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

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

我只是连续尝试了10次,元素只有在第4次尝试时才可见

这可能来自以前执行代码时留下的内存垃圾吗

我使用的是Eclipse版本:光子发行版(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()方法的功能之一是调用布局管理器。否则,组件的大小()为(0,0),因此无需绘制任何内容

此外,所有GUI组件都应该在
事件调度线程(EDT)
上创建,否则会产生随机结果。有关更多信息,请阅读上的Swing教程部分

查看中的
FrameDemo
,了解如何构造代码以避免出现问题的最基本示例。它显示了如何在EDT上创建组件以及如何使框架可见

在我调整窗口大小之前,它们不会显示

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

miPanel.setBounds(20, 20, 350, 450);
该语句将不起任何作用,因为框架的布局管理器将根据布局管理器的规则确定面板的大小和位置。框架的默认布局管理器是BorderLayout,因此基本上面板将获得框架的所有可用空间

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