0
mainFrame().addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent evt) 
    { 
     retrieveItems(); 
     closeAllConnections(); 
     System.exit(0); 
    } 
}); 

對於上面的代碼,retrieveItems()很好的執行,但有一個後臺任務叫doBackup()這裏面closeAllConnections()而無法執行的。該計劃似乎跳過了這項任務。以下是closeAllConnections()包含的簡要說明;爲什麼WindowClosing處理程序在退出程序之前不執行後臺任務?

public void closeAllConnections() 
{ 
    boolean shouldBackup = getBackupOnCloseStatus(); 
    if(shouldBackup) 
    { 
     doBackUp(); 
    } 
    dbManager.disconnectDB(); 
} 

使用NetBeans步調試後,我注意到,在程序執行不前,甚至應用程序退出進入doBackup()方法。這很奇怪。我非常感謝有關可能導致此行爲的任何幫助。感謝好人!

只是如果這一塊額外的信息可能是在尋找一個解決方案的幫助,我使用Swing應用程序框架,所以任務doBackup()看起來如下...

@Action 
public Task doBackUp() 
{ 
    return new DoBackUpTask(getApplication()); 
} 

private class DoBackUpTask extends org.jdesktop.application.Task<Object, Void> 
{ 
    private boolean done = false; 

    DoBackUpTask(org.jdesktop.application.Application app) 
    { 
     super(app); 
     this.setMessage("Backing-up database..."); 
    } 

    @Override 
    protected Object doInBackground() 
    { 
     File destDir = new File(appManager.getBackUpDir()); 
     done = backUpDataBase(destDir); 
     return null; 
    } 

    @Override 
    protected void succeeded(Object result) 
    { 
     if(done) 
     { 
      setMessage("BackUp completed."); 
     } 
    } 
} 
+2

你在任何地方設置Jframe的默認關閉操作? – 2013-03-20 03:43:10

+1

我想說的是,因爲你調用'System.exit(0)'可以執行'DoBackUpTask'前(假設它是一個非守護線程) – MadProgrammer 2013-03-20 03:47:27

+0

@HovercraftFullOfEels我didin't明確設置默認的關閉操作。但我懷疑Netbeans GUI-Builder可能會在應用程序的mainFrame(在SAF情況下爲'FrameView')使用'X'按鈕關閉時調用System.exit(0)。 – CodeBurner 2013-03-20 04:12:54

回答

0

這可能不是最好的答案,但我注意到,有時候打電話給System.exit(0)會把一切都關掉。當調用一個依賴於前一行結果的方法時,我遇到了一個問題。一切都應該是好的,但是它不能正確工作,因爲它在前一行完成之前正在執行下一行。我敢肯定,有人可以更多地討論事件調度線程,以及爲什麼即使關於計算機科學的一切都認爲它不應該發生這種情況。但這裏是我的想法:一個布爾返回值添加到closeAllConnections返回true完成後,再重新寫你的窗口偵聽器,像這樣:

mainFrame().addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent evt) 
    { 
     boolean isClosed = false; 
     while(!isClosed){ 
      retrieveItems(); 
      isClosed = closeAllConnections(); 
     }  
     System.exit(0); 
    } 
}); 

也許這會有所幫助。

+0

感謝您的幫助......我有點不喜歡循環的東西。但作爲最後的手段,這可能證明是非常有用的。 – CodeBurner 2013-03-20 04:21:51

0

我的猜測是你有另一個WindowListener其他地方叫做System.exit()或者你正在做JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),無論其他線程在執行什麼,它們都會導致應用立即終止。

+0

多達我相信,你是非常正確的,我有我的複查代碼,以確保'System.exit()的'不叫上其他任何'WindowListener',但我一直沒能發現哪裏在使用NetBeans GUI-Builder創建的'FrameView'上禁用'JFrame.EXIT_ON_CLOSE'。當我準備好時,我可能會......但是你有什麼快速的想法嗎? – CodeBurner 2013-03-22 13:50:17

相關問題