我有一個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. 單擊模態iframe關閉對話框?
- 4. 模態對話框關閉立即
- 5. jQuery UI的對話框不會關閉
- 6. jQuery的對話框不會關閉
- 7. jQuery UI對話框不會關閉
- 8. 模態對話框中的模態對話框 - 兩者在關閉時關閉 - 爲什麼?
- 9. 在Android中關閉對話框而不關閉對話框
- 10. Android對話框關閉()不關閉
- 11. 模式對話框不會關閉鍵盤
- 12. 我無法在關閉對話框中關閉對話框
- 13. JQuery模式對話框關閉事件
- 14. Fancyapp模式對話框關閉的iFrame
- 15. WPF MVVM DialogService關閉模式對話框?
- 16. jQuery的模式對話框關閉
- 17. Jquery對話框關閉按鈕不關閉;對話框只能打開一次
- 18. 關閉jQuery Datepicker關閉jQuery對話框
- 19. 關閉Swing模式彈出框
- 20. 如何在Java Swing中關閉PrinterJob對話框?
- 21. jQuery UI的模態對話框關閉上點擊自己
- 22. 如何關閉模態對話框的彈出窗口?
- 23. 離子獲取模態對話框組件自動關閉
- 24. JQuery模態對話框 - 銷燬還是關閉?
- 25. Qt,非模態對話框本身沒有關閉
- 26. 如何關閉另一個模態對話框?
- 27. MFC,如何從主窗口關閉模態對話框?
- 28. 關閉Dojo中的所有模態對話框
- 29. 如何使用iframe關閉jQuery模態對話框?
- 30. 引導模態對話框關閉屏幕,白色背景
我不小心顯示了來自非EDT線程的對話框,所以有時候只會出現問題。我猜這有些問題(儘管我無法確切知道問題的原因),但現在一切都很好,謝謝。 – 2009-12-18 01:40:07
'assert java.awt.EvenQueue.isDispatchThread();'是你的朋友(和'assert!java.awt.EvenQueue.isDispatchThread();')。 – 2009-12-18 02:05:30