我們有一個帶有套接字通信和其他線程的Swing應用程序。我們知道我們需要使用SwingUtilities.invokeLater()
來更新其他線程的Swing顯示。但如何JOptionPane
?我們是否需要使用SwingUtilities.invokeLater()
從其他線程啓動JOptionPane
?哪個線程啓動JOptionPane?
如果答案是肯定的,如何使用JOptionPane來阻止程序?
如果答案是否定的,JOptionPane不屬於GUI顯示?
我們有一個帶有套接字通信和其他線程的Swing應用程序。我們知道我們需要使用SwingUtilities.invokeLater()
來更新其他線程的Swing顯示。但如何JOptionPane
?我們是否需要使用SwingUtilities.invokeLater()
從其他線程啓動JOptionPane
?哪個線程啓動JOptionPane?
如果答案是肯定的,如何使用JOptionPane來阻止程序?
如果答案是否定的,JOptionPane不屬於GUI顯示?
如果answwer是肯定的,如何使用的JOptionPane阻止程序
答案是肯定的確實。您應該訪問/修改/ ...事件調度線程上的所有Swing組件。所以你的後臺線程需要使用一些機制來調用EDT上的JOptionPane
。使用SwingUtilities#invokeLater
是一個選項,但不是阻塞的。
使用SwingUtilities#invokeAndWait
作爲阻止行爲。這個方法將等到可運行結束之後才返回。
+1我沒有意識到這個問題可以解釋爲2種方式,直到我讀你的對這個問題發表評論。 OP可能意味着你的方式。 –
是的,您需要使用SwingUtilities.invokeLater()
來啓動JOptionPane - 否則JOptionPane可能無法響應。由於它是一個模式容器,默認情況下它應該阻止對主容器的輸入。有關更多詳細信息,請參閱http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html。
我可能誤解了你的問題。我以爲你想要JOptionPane阻止父框架上的用戶輸入。如果你想讓JOptionPane阻止程序的進一步執行,你需要使用Robin的建議:SwingUtilities.invokeAndWait() - http://docs.oracle.com/javase/6/docs/api/javax/swing/ SwingUtilities.html#invokeAndWait(java.lang.Runnable) –
[exaclty](http://stackoverflow.com/a/12643642/714968) – mKorbel
答案是肯定的,你只能從EventQueue中調用swing組件。看看Is JOptionPane.showMessageDialog thread safe?
'SwingUtilities#invokeAndWait' – Robin