2015-05-07 61 views
1

我不太喜歡JFrame.EXIT_ON_CLOSE選項。如果有一個線程正在寫入文件,或者正在下載某個選項,則該選項將在完成之前被殺死。相反,我試圖通過破壞GUI窗口正常終止的程序:如何避免JFrame.EXIT_ON_CLOSE並優雅地終止揮杆計劃

/** 
    * Terminates the whole program while saving settings. 
    */ 
    public void Terminate() { 
    //gui is JFrame representing the application window 
    gui.setVisible(false); 
    gui.dispose(); 
    gui.destroyTray(); 
    //Stop tool thread if running 
    if(ToolRunning()) 
     StopTool(); 
    //Save settings 
    if(settings==null) { 
     System.out.println("Settings is null!"); 
     return; 
    } 
    try { 
     settings.loadSettingsFromBoundFields(); 
     settings.saveToFile(SETTINGS_FILE, false); 
    } 
    catch(IOException e) { 
     System.err.println("Problem saving settings:"); 
     e.printStackTrace(System.err); 
    } 
    //Here, no non-deamon threads should be running (daemon thread does not prolong the applicatione execution). 
    } 

但程序繼續運行,當我dispose()JFrame了Swing線程不會退出。還有什麼可以阻止Swing?當我使用相同的方法制作更簡單的程序時(隱藏窗口和dispose())它工作。這意味着我的項目的複雜性隱藏了泄漏的東西。我怎樣才能找到什麼阻止來自終止的Swing線程?

+0

調用setVisible(假)==處置()如果JVM仍然活着 – mKorbel

+0

嘗試的WindowListener /國家/ E.I。 – mKorbel

+0

1.(沒有... meta多次)。我們不是幫助臺,2.(爲了避免錯誤的答案)有兩種類型的進程需要敲定/關閉()deamon和non_deamon線程,3.我如何找到什麼阻止Swing線程終止? - JProfiler在運行時向你展示所有不是finalize/close()的混亂,包括。 class/void /變量名稱/繼承或它們的嵌套API對象 – mKorbel

回答