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中的invokeLater
和invokeAndWait
方法等)。
这种间歇性故障表明同步问题。 确保在EDT上构建和运行GUI。 此外,您可能希望看到这个非常简单的~100行GUI 聊天程序 。
对setVisible的调用太早了。 它立即运行并在调用窗口时绘制窗口。 如果尚未将所有组件添加到框架中,则它们不会被绘制。 这就是为什么调整框架的大小似乎使它出现。 因为resize会导致重绘执行。
使setVisible成为JFrame构造函数中的最后一个调用。