2

我们有一个带有套接字通信和其他线程的 Swing 应用程序。我们知道我们需要使用SwingUtilities.invokeLater()其他线程来更新 Swing 显示。但是怎么样JOptionPane?我们是否需要使用SwingUtilities.invokeLater()其他线程来启动JOptionPane

如果答案是肯定的,如何使用 JOptionPane 来阻止程序?

如果答案是否定的,JOptionPane 不属于 GUI 显示吗?

4

3 回答 3

2

是的,您需要使用SwingUtilities.invokeLater()来启动 JOptionPane - 否则 JOptionPane 可能没有响应。由于它是一个模态容器,默认情况下它应该阻止对主容器的输入。有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html 。

于 2012-12-13T16:11:10.270 回答
2

答案是肯定的,你只需要从 EventQueue 中调用 swing 组件。看看JOptionPane.showMessageDialog 线程是否安全?

于 2012-12-13T16:12:52.587 回答
2

如果答案是肯定的,如何使用 JOptionPane 来阻止程序

答案确实是肯定的。您应该访问/修改/... Event Dispatch Thread 上的所有 Swing 组件。所以你的后台线程需要使用某种机制JOptionPane在 EDT 上调用。使用SwingUtilities#invokeLater是一种选择,但不是阻塞的选择。

用于SwingUtilities#invokeAndWait阻塞行为。此方法将等到可运行对象完成后再返回。

于 2012-12-13T20:04:56.223 回答