2011-09-27 37 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()解決這對我

相關問題