我们有一个带有套接字通信和其他线程的 Swing 应用程序。我们知道我们需要使用SwingUtilities.invokeLater()
其他线程来更新 Swing 显示。但是怎么样JOptionPane
?我们是否需要使用SwingUtilities.invokeLater()
其他线程来启动JOptionPane
?
如果答案是肯定的,如何使用 JOptionPane 来阻止程序?
如果答案是否定的,JOptionPane 不属于 GUI 显示吗?
是的,您需要使用SwingUtilities.invokeLater()
来启动 JOptionPane - 否则 JOptionPane 可能没有响应。由于它是一个模态容器,默认情况下它应该阻止对主容器的输入。有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html 。
答案是肯定的,你只需要从 EventQueue 中调用 swing 组件。看看JOptionPane.showMessageDialog 线程是否安全?
如果答案是肯定的,如何使用 JOptionPane 来阻止程序
答案确实是肯定的。您应该访问/修改/... Event Dispatch Thread 上的所有 Swing 组件。所以你的后台线程需要使用某种机制JOptionPane
在 EDT 上调用。使用SwingUtilities#invokeLater
是一种选择,但不是阻塞的选择。
用于SwingUtilities#invokeAndWait
阻塞行为。此方法将等到可运行对象完成后再返回。