JPanel没有在JFrame中显示 – Java

Server是我制作的扩展JFrame的类。

Server serverApp = new Server(TITLE, WIDTH, HEIGHT, true, false); 

我已经有效地删除了几乎所有其他代码,但问题仍然存在!

  c = getContentPane(); c.setLayout(new BorderLayout()); //Components /***AHHHHH***/ lblEnterMessage = new JLabel("Enter Message "); txtEnterMessage = new JTextField(50); txtEnterMessage.addActionListener(this); btnSend = new JButton("Send"); btnSend.addActionListener(this); taDisplay = new JTextArea("Test, test test.", 10, 0); taDisplay.setEditable(false); JScrollPane jspDisplay = new JScrollPane(taDisplay); pnlChatTop = new JPanel(new FlowLayout()); pnlChatTop.add(lblEnterMessage); pnlChatTop.add(txtEnterMessage); pnlChatTop.add(btnSend); pnlChat = new JPanel(new BorderLayout()); pnlChat.add(pnlChatTop, BorderLayout.CENTER); pnlChat.add(jspDisplay, BorderLayout.SOUTH); c.add(pnlChat, BorderLayout.CENTER); 

哦,当然,它突然工作了…而我正要删除这个问题,但我再次运行它几次,只是随机工作,有时不工作。

我刚才记得在使用其他’项目’之前遇到这个问题,而我的解决方案是让窗口可以resize。 每当我简单地调整它的大小时,组件就会显示出来。

这一次,我正在制作游戏,我不希望它可以resize……我想知道如何以正确的方式解决这个问题。

救命! 有谁知道为什么会这样?

谢谢。

编辑:

 public Server(String title, int sizeW, int sizeH, boolean visibility, boolean resizability) { /* Initialization */ //JFrame settings setTitle(title); setSize(sizeW, sizeH); setVisible(visibility); setResizable(resizability); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(this); 

这会有帮助吗?

从您提供的代码中,问题并不明显。

在调用setVisible(true)之前,听起来您需要pack() , setSize(int,int) , setExtendedState(int)和/或setResizable(boolean)方法的某种组合。


编辑:

 setTitle(title); setSize(sizeW, sizeH); setVisible(visibility); setResizable(resizability); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

此代码中存在竞争条件。 有时主线程会在帧显示之前将组件置于正确的状态; 有时框架在一切准备就绪之前赢得并开始绘画。

使用Swing的事情是你自动使用multithreading代码。 虽然初始化主线程上的控件通常是安全的,但是一旦你启动事件调度线程 (因为setVisible(true)肯定会这样做),所有的赌注都会被关闭。

尽可能延迟调用setVisible(true) 。 最好不要在JFrame构造函数中调用它。

如果您在启动应用程序后需要修改Swing控件,则需要通过事件调度线程来执行此操作(请参阅SwingUtilities中的invokeLaterinvokeAndWait方法等)。

这种间歇性故障表明同步问题。 确保在EDT上构建和运行GUI。 此外,您可能希望看到这个非常简单的~100行GUI 聊天程序 。

对setVisible的调用太早了。 它立即运行并在调用窗口时绘制窗口。 如果尚未将所有组件添加到框架中,则它们不会被绘制。 这就是为什么调整框架的大小似乎使它出现。 因为resize会导致重绘执行。

使setVisible成为JFrame构造函数中的最后一个调用。