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()です。

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

doBackup()Netbeans Step-Debugger を使用した後、アプリケーションが終了する前に、プログラムの実行がメソッドに入っていないことに気付きました。変ですね。この動作を引き起こしている可能性のあるものに関して、何か助けていただければ幸いです。良い人たちに感謝します!

この追加情報が解決策を見つけるのに役立つかもしれませんが、私は Swing Application Framework を使用しているため、タスク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.");
        }
    }
}
4

2 に答える 2

0

私の推測では、他のスレッドが実行されているかどうかに関係なく、別のWindowListener場所で呼び出しをSystem.exit()行っているか、または実行している可能性があります。JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

于 2013-03-20T03:55:41.450 に答える
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);
    }
});

多分これが役立つでしょう。

于 2013-03-20T03:50:11.353 に答える