繁体   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