当我进行一些特殊的GUI交互时,我遇到了这个问题。 这是我的情况:我使用一个对话框。我不打电话 System.exit()但稍后将返回给应用程序。 通常情况下,当JVM看不到它时,它就会存在 非deaemon线程正在运行。但使用此对话框后, 它不起作用。
我百分之百地保证在对话框中调用dispose() 有问题,也有关于申请的主要框架。 我在IDE和运行时都得到了这个 命令行。我可以用按钮按下来杀死它 IDE,或命令行中的Ctrl-C。
但是如果JVM正确终止它当然会更好 在交付申请之前本身。
任何线索,这是一个已知的问题吗?我使用的是JDK 1.7,但是 问题已在JDK 1.6中显示出来。
最好的问候
P.S。:只是阅读: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html 过去也有过类似的问题。也许这是一个新问题。 过去的问题是: 其他包可以为内部需求创建可显示的组件,并且永远不会使它们不可显示。请参阅4515058,4671025和4465537。 我将沿着弹出菜单的显式setVisible(false)尝试一些。
答案 0 :(得分:2)
你确定弹出窗口被破坏而不仅仅是隐藏吗?我相信默认操作是隐藏,并将默认关闭操作设置为JFRAME.EXIT_ON_CLOSE可能会解决它。
诊断问题的另一种方法可能是使用分析器,例如Netbeans附带的分析器。在应用程序终止之前使用实时视图和调试点,您可以检查实时对象。
答案 1 :(得分:1)
关闭框架时的默认操作是隐藏它。 UI线程仍然存在。
如果你希望JVM在关闭你制作的框架时退出(可能是你的“弹出窗口”?),你必须明确说出来,例如:通过frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
,更多文档here。可能您只需要DISPOSE_ON_CLOSE作为defaultCloseOperation。
另一种方法是将windowListener添加到框架中,并在框架关闭时自行决定正确的操作。
答案 2 :(得分:0)
听起来至少有一个线程阻塞,无法响应中断。也许在有问题的线程上使用.getState()可能会对这个问题有所了解。
http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState%28%29
答案 3 :(得分:0)
我遇到同样的问题,在dispose()
中调用EventQueue.invokeLater(new Runnable() {...}
为我解决了