JOptionPane显示一个空白窗口

时间:2014-06-02 10:28:04

标签: java multithreading joptionpane

我目前正在开发游戏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?

1 个答案:

答案 0 :(得分:1)

JOptionPane类与Swing的大多数类似,线程安全。只能在美国东部时间调用showMessageDialog()。 EDT本身应该只用于GUI组件,有时候只用于小任务,任何繁重的处理都应该在后台线程中完成。

现在你的代码:

  • 您在ED​​T之外创建GUI组件
  • 之后您在EDT上进行了大量处理,这不允许Swing重新绘制您的组件(我想这是问题所在)
  • 然后你在一个完全没有做任何事情的线程上调用中断。中断它不会消息消失。

实现目标似乎是一个更好的方法是使用SwingWorker。使用消息或进度条创建消息JFrame或不显示消息,显示消息,然后启动将执行处理的SwingWorker,完成后将隐藏JFrame