簡體   English   中英

從Swing中的事件調度線程之外的另一個線程中泵出事件

[英]Pump events from another thread than the Event Dispatching Thread in Swing

在我的應用程序中,在某些情況下,可能會中斷AWT的事件調度線程(EDT)中啟動的某些過程。 然后,它等待來自用戶的輸入。 the,由於該進程位於EDT中,因此整個應用程序將凍結,並且用戶無法重新啟動該進程,從而造成死鎖。 有沒有辦法中斷EDT並從另一個線程啟動新的事件泵? 然后,用戶將能夠與UI進行交互。

我嘗試執行的操作或多或少類似於打開模式對話框,但由於我的組件很復雜,我不希望使用對話框。 我寧願將其顯示在我的根窗格中。 因此,我看了一下如何在java.awt.Dialog中完成此操作,並對它有了很好的理解,但是所使用的最重要的類(EventDispatchThread,SequencedEvent等)受到了保護,因此我無法訪問。


謝謝大家的答案。

我會更具體。 我實際上正在開發一個嵌入本地腳本語言的應用程序。 我正在為此語言開發調試器。 每當遇到斷點時,調試器(與所有調試器一樣)將停止腳本執行。 腳本化的過程可以從代碼中的許多地方(包括EDT)觸發,因此將過程從EDT中移除是不可取的。 我希望將調試器UI嵌入到應用程序中(准確地說是在側窗格中)。 因此,當遇到斷點時,我將需要中斷當前線程(可能是EDT,主要是說EDT),至少調試器的UI仍應響應。 另外,我正在JDK 1.4之上開發,因此無法使用JDK7。

我目前正在做的是打開一個嵌入調試器的JDialog。 一切正常,但是正如我說的那樣,我對這種解決方案不完全滿意,因為我真的希望將調試器嵌入到主窗口中。

如果使用的是JDK7,則可以使用SecondaryLoop接口。 可以通過EventQueue.createSecondaryLoop方法創建此接口的實例。

一個內容豐富的博客文章,其中有一個示例,但是服務器暫時處於離線狀態。

稍作修改,因為我仍然不確定我是否理解您的問題。

如果要等待來自工作線程的用戶輸入,則可以使用SwingUtilities.invokeAndWait方法並使用阻塞方法(例如,顯示JOptionPane來檢索用戶輸入)。 由於invokeAndWait您的工作線程將被停止,直到處理EDT上的Runnable 如果您在EDT上使用阻止方法來檢索用戶輸入,則Runnable僅在用戶提供其輸入后才能完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM