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

时间:2018-10-01 17:18:48

标签: java swing jframe jpanel visibility

我设法解决了这个问题,但是我不明白为什么相同的代码会导致不同的结果。一些同学也有同样的问题。

问题是我在执行miVentana.setVisible(true);之前会在chicha();之前使用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); } } ,但是如果我再次运行它,有时在调整窗口大小之前它们是不可见的。几次甚至连JPanel背景色都不可见。只需单击IDE上的“运行”底部即可,而无需进行其他任何更改。

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

这是否可以归因于代码先前执行时剩余的一些内存垃圾?

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

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

library(tidyverse)
ggplot(mpg, aes(hwy)) + 
  geom_histogram() + 
  theme_classic() + 
  NULL

1 个答案:

答案 0 :(得分:1)

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

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

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

看看How to Make Frames中的FrameDemo,这是最基本的代码结构示例,可避免出现问题。它显示了如何在EDT上创建组件以及如何使框架可见。

  

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

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

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

该语句无济于事,因为框架的布局管理器将根据布局管理器的规则确定面板的大小和位置。框架的默认布局管理器是BorderLayout,因此基本上,面板将获得该框架的所有可用空间。

本教程还有Layout Managers一节,您应该阅读。