我有一個SwingWorker線程,它啓動一個模式對話框(來自一個屬性更改偵聽器,它偵聽已啓動的StateValue),並且swing工作者繼續執行其工作。但是,看起來done方法沒有被調用,因爲在EDT上調用了該方法,但擺動工作人員的模態對話框阻止了EDT。所以,我無法關閉EDT中的對話框(或完成的方法)。現在,我只是在該方法結束時關閉doInBackground中的對話框,但由於doInBackground不在EDT上,似乎對doInBackground有點不安全。處理這個問題的最好方法是什麼?謝謝。Swing Worker模態對話框不會關閉
2
A
回答
4
即使顯示模態對話框,調度循環仍應繼續調度與SwingWorker
相關的事件。
這適用於我。
import javax.swing.*;
public class Unions {
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
runEDT();
}});
}
private static void runEDT() {
final JDialog dialog = new JDialog((JFrame)null, true);
new SwingWorker<Void,Void>() {
@Override protected Void doInBackground() throws Exception {
// But this is working.
Thread.sleep(3000);
return null;
}
@Override protected void done() {
dialog.setVisible(false);
}
}.execute();
dialog.setVisible(true);
}
}
2
參考:
當一個模式對話框在Swing推出,該線程的執行被停止,直到關閉對話框。
這就是爲什麼你的done()方法從來沒有被調用(doInBackground()不能完成,done()僅在之後被調用)。
從EDT線程調用的動作打開模態對話框稍有不同。 EDT本身將繼續處理事件,但打開模式對話框的實際事件線程代碼(動作代碼)仍然被阻塞(並等待對話框關閉)。
當然,在非模態對話的情況下,這個問題永遠不會出現。
順便說一下:你永遠不應該從美國東部時間之外打開一個對話框。 如果決定是在非EDT線程上進行的,則需要使用SwingUtilities.invokeLater()實際打開對話框。
聽起來很複雜,但事實上並非如此,一旦你掌握了EDT的概念。
相關問題
- 1. angularjs模態模式對話框關閉
- 2. Java Swing - 如何使它關閉對話框不會關閉整個程序?
- 3. 關閉時重置模態對話框
- 4. 模態對話框關閉立即
- 5. 單擊模態iframe關閉對話框?
- 6. 無法關閉模態對話框
- 7. 動態關閉對話框
- 8. 從模態對話框返回時間時,關閉對話框
- 9. jQuery的對話框不會關閉
- 10. jQuery UI對話框不會關閉
- 11. jQuery UI的對話框不會關閉
- 12. jQuery UI的對話框不會關閉
- 13. jquery ui對話框不會「關閉」
- 14. jquery對話框模式不關閉
- 15. 模態對話框中的模態對話框 - 兩者在關閉時關閉 - 爲什麼?
- 16. 在Android中關閉對話框而不關閉對話框
- 17. 關注jquery模態對話框後的文本框關閉
- 18. Android對話框關閉()不關閉
- 19. jQuery對話框不關閉
- 20. 對話框關閉不primefaces
- 21. 按下「關閉」按鈕後XUL對話框不會關閉
- 22. 模式對話框不會關閉鍵盤
- 23. jQuery的模態對話框按鈕關閉不正常工作
- 24. 如何對關閉模式對話框
- 25. 我無法在關閉對話框中關閉對話框
- 26. 關閉對話框,關閉其主對話框
- 27. 聚焦關閉模式對話框
- 28. WPF MVVM DialogService關閉模式對話框?
- 29. jQuery UI:模型對話框'關閉'
- 30. JQuery模式對話框關閉事件
我不小心顯示了來自非EDT線程的對話框,所以有時候只會出現問題。我猜這有些問題(儘管我無法確切知道問題的原因),但現在一切都很好,謝謝。 – 2009-12-18 01:40:07
'assert java.awt.EvenQueue.isDispatchThread();'是你的朋友(和'assert!java.awt.EvenQueue.isDispatchThread();')。 – 2009-12-18 02:05:30