我目前正在开发 ludo 游戏的在线版本。
如果有足够多的玩家连接,客户端连接的服务器会发送命令,通知每个客户端游戏将开始。
我想在客户端显示一个 JOptionPane,上面写着类似“等待游戏开始”的内容,然后继续等待服务器的新输入。
起初我的代码是这样的:
ImageIcon icon = new ImageIcon(getClass().getResource("/resources/waiting.gif"));
JOptionPane.showMessageDialog(null, "Waiting for game start",
"Please Wait",JOptionPane.INFORMATION_MESSAGE, icon);
command = (String) in.readObject();
到目前为止,这在显示 JOptionPane 时有效。问题:代码被中断,直到客户端按下确定。然后窗口消失了,程序等待。所以这不是我想要实现的目标。
所以我尝试在它自己的线程中运行 JOptionPane 并在收到消息时关闭线程。这看起来像这样:
Thread t = new Thread(new Runnable(){
public void run(){
synchronized(this){
ImageIcon icon = new ImageIcon(getClass().getResource("/resources/waiting.gif"));
JOptionPane.showMessageDialog(null, "Waiting for game start",
"Please Wait",JOptionPane.INFORMATION_MESSAGE, icon);
}
}
});
t.start();
command = (String) in.readObject();
t.interrupt();
这解决了 JOptionPane 下的代码未执行但运行这样的代码将 JOptionPane 显示为带有标题的空白窗口的问题。下面的屏幕截图...
http://i.stack.imgur.com/2W42B.png
所以我的问题是:我该如何解决这个问题,或者有没有其他方法可以在不停止代码执行的情况下显示 JOptionPane?
最佳答案
与大多数 Swing 一样,JOptionPane
类不是线程安全的。只能从 EDT 调用 showMessageDialog()
。 EDT 本身应该只用于 GUI 组件和有时是小任务,任何繁重的处理都应该在后台线程中完成。
现在关于您的代码:
- 您在 EDT 之外创建一个 GUI 组件
- 之后您对 EDT 进行了大量处理,这不允许 Swing 重新绘制您的组件(我想这就是这里的问题)
- 然后您在一个实际上什么都不做的线程上调用中断。打断它不会使消息消失。
实现目标的更好方法是使用 SwingWorker
。创建一个消息 JFrame
,带有消息或进度条或其他内容,显示它,然后启动一个 SwingWorker
来进行处理,完成后 - 将隐藏你 JFrame
.
关于java - JOptionPane 显示一个空白窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23992385/