2011-09-27 88 views
0

我在做某些特殊的GUI交互时遇到此问题。 这是我的情况:我使用一个对话框。我不打电话
System.exit()但稍后退出应用程序并返回。 通常,当JVM发现没有其他 非拒绝服务线程正在运行时,JVM就会存在。但是在使用这个对话框后, 不起作用。可能导致Java在返回后继续运行的原因

我100%确信在对话框 上调用了dispose(),并且还在应用程序的主框架上调用了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,46710254465537。 我会尝试一些显式的setVisible(false)弹出菜单。

回答

1

关闭框架时的默认操作是隐藏它。 UI线程仍然活着。

如果你想在JVM当您关闭您做出框架(可能是你的“弹出式”?)退出,你必须明确地这么说,如通过做frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,更多文档here。可能您只需要将DISPOSE_ON_CLOSE作为defaultCloseOperation。

的另一种方法是一个的WindowListener添加到框架,并在框架关闭自己决定正确的行动。

+1

它不是关于弹出对话框,而是一个弹出菜单。当丢失dispose()是问题时,我不能正确退出时,我不使用弹出菜单。 –

0

听起来像至少一个线程被阻塞,并且可以不中断作出响应。也许在有问题的线程上使用.getState()可能会让问题更加清晰。

http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState%28%29

+0

我正在使用的IDE允许创建线程快照。在JDK 1.6.0_27下,我只看到守护进程线程,除了AWT关闭,DestroyJavaVM,VM和GC线程以及一个AWT-EventQueue-0(原文!)。我不知道AWT-EventQueue-0在哪里开始。它做了一个等待。 –

2

你确定弹出被破坏,而不是只是被隐藏了?我相信默认操作是隐藏的,并将默认关闭操作设置为JFRAME.EXIT_ON_CLOSE可能会解决它。

诊断问题的另一种方法可能是使用一个分析器,如一个随NetBeans。在应用程序终止之前使用实时视图和调试点,并且可以检查活动对象。

+1

它不是关于弹出对话框,而是弹出菜单。当丢失dispose()是问题时,我不能正确退出时,我不使用弹出菜单。 –

0

我有同样的问题,要求在EventQueue.invokeLater(new Runnable() {...}dispose()解决这对我

相关问题