java - JOptionPane 显示一个空白窗口

标签 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?

最佳答案

与大多数 Swing 一样,JOptionPane不是线程安全的。只能从 EDT 调用 showMessageDialog()。 EDT 本身应该只用于 GUI 组件和有时是小任务,任何繁重的处理都应该在后台线程中完成。

现在关于您的代码:

  • 您在 EDT 之外创建一个 GUI 组件
  • 之后您对 EDT 进行了大量处理,这不允许 Swing 重新绘制您的组件(我想这就是这里的问题)
  • 然后您在一个实际上什么都不做的线程上调用中断。打断它不会使消息消失。

实现目标的更好方法是使用 SwingWorker。创建一个消息 JFrame,带有消息或进度条或其他内容,显示它,然后启动一个 SwingWorker 来进行处理,完成后 - 将隐藏你 JFrame.

关于java - JOptionPane 显示一个空白窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23992385/

相关文章:

java - 如何在 jsoup 中处理 JavaScript 重定向

Java 同步类实例

java - Java ThreadPoolExecutor 测量任务在执行之前在队列中等待的时间

java - JOptionPane 传递自定义按钮

java - 为什么 Eclipsepedia 的 TreeViewer 需要这段代码?

java - Hibernate 延迟初始化集合,带有 Oracle DB 提示

java - 数组索引越界帮助 (Java)

java - 多线程的synchronizedList

java - 使用自定义 JOptionPane 按钮? int 延迟错误?

java - JOptionPane 给出 NullPointerException 并且不显示