我目前正在开发游戏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?
答案 0 :(得分:1)
JOptionPane
类与Swing的大多数类似,不线程安全。只能在美国东部时间调用showMessageDialog()
。 EDT本身应该只用于GUI组件,有时候只用于小任务,任何繁重的处理都应该在后台线程中完成。
现在你的代码:
实现目标似乎是一个更好的方法是使用SwingWorker
。使用消息或进度条创建消息JFrame
或不显示消息,显示消息,然后启动将执行处理的SwingWorker
,完成后将隐藏JFrame
。