2012-12-13 36 views
2

我們有一個帶有套接字通信和其他線程的Swing應用程序。我們知道我們需要使用SwingUtilities.invokeLater()來更新其他線程的Swing顯示。但如何JOptionPane?我們是否需要使用SwingUtilities.invokeLater()從其他線程啓動JOptionPane哪個線程啓動JOptionPane?

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

如果答案是否定的,JOptionPane不屬於GUI顯示?

+2

'SwingUtilities#invokeAndWait' – Robin

回答

2

如果answwer是肯定的,如何使用的JOptionPane阻止程序

答案是肯定的確實。您應該訪問/修改/ ...事件調度線程上的所有Swing組件。所以你的後臺線程需要使用一些機制來調用EDT上的JOptionPane。使用SwingUtilities#invokeLater是一個選項,但不是阻塞的。

使用SwingUtilities#invokeAndWait作爲阻止行爲。這個方法將等到可運行結束之後才返回。

+0

+1我沒有意識到這個問題可以解釋爲2種方式,直到我讀你的對這個問題發表評論。 OP可能意味着你的方式。 –

2

是的,您需要使用SwingUtilities.invokeLater()來啓動JOptionPane - 否則JOptionPane可能無法響應。由於它是一個模式容器,默認情況下它應該阻止對主容器的輸入。有關更多詳細信息,請參閱http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html

+0

我可能誤解了你的問題。我以爲你想要JOptionPane阻止父框架上的用戶輸入。如果你想讓JOptionPane阻止程序的進一步執行,你需要使用Robin的建議:SwingUtilities.invokeAndWait() - http://docs.oracle.com/javase/6/docs/api/javax/swing/ SwingUtilities.html#invokeAndWait(java.lang.Runnable) –

+0

[exaclty](http://stackoverflow.com/a/12643642/714968) – mKorbel