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);
哦,当时,它刚刚突然工作......而我正准备删除这个问题,但我再次运行它几次而且只是随机工作而且有时不工作。
我刚刚记得在使用其他“项目”之前遇到此问题,我的解决方案是让窗口可调整大小。每当我调整它的大小时,组件就会显示出来。
这一次,我正在制作一款游戏而且我不希望它可以调整大小...而且我想知道如何以正确的方式解决这个问题。
帮助!有谁知道为什么会这样?
感谢。
编辑:
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);
这会有帮助吗?
答案 0 :(得分:4)
从您提供的代码中,问题并不明显。
在调用pack()之前,您似乎想要setSize(int,int),setExtendedState(int),setResizable(boolean)和/或setVisible(true)方法的某种组合。
编辑:
setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
此代码中存在竞争条件。有时主线程会在帧显示之前将组件置于正确的状态;有时框架在一切准备就绪之前赢得并开始绘画。
使用Swing的事情是你自动使用多线程代码。虽然初始化主线程上的控件通常是安全的,但是一旦你启动事件调度线程(因为setVisible(true)
肯定会这样做),所有的赌注都会关闭。
尽可能延迟致电setVisible(true)
。最好不要在JFrame
构造函数中调用它。
如果您在启动应用程序后需要修改Swing控件,则需要通过事件派发线程来执行此操作(请参阅invokeLater
和{{1 SwingUtilities中的方法,等等。)
答案 1 :(得分:3)
此类间歇性故障表明同步问题。确保在EDT上构建并运行GUI。另外,您可能希望看到这个非常简单的~100行GUI chat program。
答案 2 :(得分:2)
调用setVisible太早了。它会立即运行并在调用窗口时绘制窗口。如果尚未将所有组件添加到框架中,则它们不会被绘制。这就是为什么调整框架的大小似乎使它出现。因为调整大小会导致重绘执行。
使setVisible成为JFrame构造函数中的最后一次调用。