java - 从另一个线程而不是 Swing 中的事件调度线程泵事件

标签 java swing event-dispatch-thread

在我的应用程序中,某些在 AWT 的事件调度线程 (EDT) 中启动的进程可能会在特定情况下中断。然后等待用户输入。唉,由于该进程位于 EDT 中,整个应用程序会卡住,用户无法重新启动该进程,从而造成死锁。有什么办法可以中断 EDT 并从另一个线程启动新的事件泵吗?然后用户将能够与 UI 交互。

我正在尝试做的事情看起来或多或少像打开一个模态对话框,只是我不需要对话框,因为我的组件很复杂。我宁愿将它显示在我的根 Pane 中。因此,我查看了它是如何在 java.awt.Dialog 中完成的,并且对它有了很好的理解,但是使用的最重要的类(EventDispatchThread、SequencedEvent 等)受到保护,因此我无法访问。


谢谢大家的回答。

我会更具体一点。我实际上正在开发一个嵌入了本土脚本语言的应用程序。我正在为这种语言开发调试器。调试器(和所有调试器一样)会在遇到断点时停止脚本执行。脚本化进程可以从代码中的许多地方(包括从 EDT)触发,因此将进程从 EDT 中移除不是一种选择。我希望将调试器 UI 嵌入到应用程序中(准确地说是在侧 Pane 中)。因此,当遇到断点时,我需要中断当前线程(可能是 EDT,主要不是说),至少调试器的 UI 仍应响应。此外,我正在 JDK 1.4 之上进行开发,所以没办法使用 JDK7 唉。

我目前正在做的是打开一个嵌入了调试器的 JDialog。一切正常,但正如我所说,我对这个解决方案并不完全满意,因为我真的希望我的调试器直接嵌入到我的主窗口中。

最佳答案

如果您使用的是 JDK7,则可以使用 SecondaryLoop界面。可以通过 EventQueue.createSecondaryLoop 创建此接口(interface)的实例方法

an informative blog post举个例子,但服务器目前似乎处于离线状态。

一个小的修改,因为我仍然不能完全确定我理解你的问题。

如果你想等待来自工作线程的用户输入,你可以使用 SwingUtilities.invokeAndWait 方法并使用阻塞方法(例如显示 JOptionPane 来检索用户输入)。由于 invokeAndWait,您的工作线程将停止,直到处理完 EDT 上的 Runnable。如果您在 EDT 上使用阻塞方法来检索用户输入,则 Runnable 将仅在用户提供他/她的输入时完成

关于java - 从另一个线程而不是 Swing 中的事件调度线程泵事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554835/

相关文章:

java - Eclipse 工作区因不正确关闭而损坏

java - 使用 jdk 5 运行小代码片段,使用 jdk 6 运行其余代码

java - NetBeans 制作的 jar 文件无法通过双击启动

java - 设置一个按钮

java - 如何在java swing中自动扩展框架的高度

ios - DispatchQueue 在 Swift 中与 main.sync 崩溃

java - 如何为现有的 Maven 项目创建 EAR 文件

java - 通过Java中的命令行界面渲染图形元素

java - 如何在事件调度线程上运行类的所有方法

java - 更新标签时,EDT 无法使用递归方法正常工作