首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止Swing EDT

如何停止Swing EDT
EN

Stack Overflow用户
提问于 2011-01-29 05:47:24
回答 2查看 2K关注 0票数 14

典型的Swing应用程序在开始时启动EDT,当最后一个窗口关闭时,应用程序基本上停止,并返回一个隐式或显式System.exit。

但我的小应用程序实际上是一个对Swing一无所知的框架的插件。我的插件在被调用时会显示一个对话框,以便从用户那里获得一些输入,然后退出,但框架将/必须继续运行。所以我不能给System.exit打电话。

但如果我不这样做,EDT将继续运行,一旦框架完成,EDT仍将运行、运行和运行……

所以我想在不终止应用程序的情况下终止EDT。我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-29 05:56:40

Oracle/Sun的以下文档对这个问题进行了一些说明:AWT Threading Issues

...

在1.4之前,helper线程从未终止过。

从1.4开始,由于4030718的修复,行为发生了变化。在当前实现中,当满足以下三个条件时,AWT终止所有帮助线程,允许应用程序干净利落地退出:

  • 本机事件队列中没有可显示的AWT或Swing components.
  • There。
  • java EventQueues中没有AWT事件。

因此,希望在不调用System.exit的情况下干净利落地退出的独立AWT应用程序必须:

  • 确保所有的AWT或Swing组件在应用程序结束时都不能显示。这可以通过在所有顶级窗口上调用Window.dispose来完成。参见Frame.getFrames。...
  • 确保应用程序向任何AWT或Swing组件注册的AWT事件侦听器的任何方法都不会陷入无限循环或无限挂起。例如,由某个AWT事件触发的AWT侦听器方法可以将相同类型的新AWT事件发布到EventQueue。参数是AWT事件侦听器的方法通常在helper线程上执行。

..。

票数 14
EN

Stack Overflow用户

发布于 2017-11-15 03:11:27

可能有一些隐藏的窗口(例如,使用JOptionPane.showMessageDialog(…)显示的对话框已经关闭)会阻止Swing退出。您可以使用以下命令进行检查

代码语言:javascript
复制
Stream.of(Window.getWindows()).forEach(System.out::println);

如果你不再需要它们,你可以很容易地摆脱它们:

代码语言:javascript
复制
Stream.of(Window.getWindows()).forEach(Window::dispose);

然后,Event Dispatch Thread应停止。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4833357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档