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() перед выходом из приложения. Это странно. Я был бы очень признателен за любую помощь в отношении того, что может вызвать такое поведение. Спасибо хорошим людям!

Только если эта часть дополнительной информации может быть полезным в поиске решения, я использую Framework приложений 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 по умолчанию в любом месте? –

+1

Я бы сказал, потому что вы вызываете 'System.exit (0)' до того, как 'DoBackUpTask' может выполняться (при условии, что это не-демонный поток) – MadProgrammer

+0

@HovercraftFullOfEels я явно не задал операцию закрытия по умолчанию ... Но я подозреваю, что GUI-Builder Netbeans может вызывать System.exit (0), когда mainFrame приложения («FrameView» в случае SAF) закрывается с помощью кнопки «X». – CodeBurner

ответ

0

Это может не лучший ответ, но я заметил, что при вызове System.exit(0) иногда он отключит все. Однажды у меня возникла проблема при вызове метода, зависящего от результатов предыдущей строки. Все должно быть хорошо, но это не сработало, потому что оно доходило до выполнения следующей строки до того, как предыдущая строка была закончена. Я уверен, что кто-то может больше рассказать о потоке отправки событий и почему это, похоже, произошло, хотя все, что касается информатики, не должно. Но вот моя мысль: Добавить логическое возвращаемое значение closeAllConnections вернуться верно, когда полный, а затем повторно написать окно слушателя, как это:

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

0

Мое предположение было бы, что у вас есть еще один WindowListener в другом месте, что звонит System.exit() или же вы делаете JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE), каждый из которых будет вызывать приложение немедленно прекратить, независимо от того, независимо от других потоков выполнения.

+0

Насколько я убежден, что вы очень правы, я перепроверил свой код, чтобы гарантировать, что 'System.exit()' не вызывается ни в каком другом 'WindowListener', но я не смог обнаружить, где отключите 'JFrame.EXIT_ON_CLOSE' в моем« FrameView », созданном с помощью GUI-Builder NetBeans. Я, вероятно, буду, когда я готов ... но у вас есть быстрые идеи? – CodeBurner

Смежные вопросы