2

.show()デッドロックを回避するためにメインスレッドでフレームを作成するべきではないことを読みましたが、これは本当の問題ですか。これは常に避けるべきですか?また、ProgressMonitorInputStream などの何らかの種類のダイアログ ボックスを表示すると、それが閉じて完了した場合でもSystem.exit()、アプリを強制終了するために呼び出す必要がありますか? JDialogはどうですか?

4

2 に答える 2

6

デッドロックを回避するために、メインスレッドで .show() フレームを使用しないでください。

その本/投稿/ウェブページを読むのをやめます。

最初のポイントに対処するには:

見落としている点もあるかと思います。

すべての UI コードは、イベント ディスパッチ スレッド(EDT) で実行する必要があります。これには、まだ画面に表示されていない UI コンポーネントも含まれます。

EDT で時間のかかるタスクを実行しないでください。これにより、画面が更新されなくなり、アプリケーションが応答しなくなります。これは、ユーザーが本当に嫌うものです。

時間のかかるタスクは、 SwingWorkerSwingUtilities.invokeLater / andWaitなどを使用して UI を再同期/更新する独自のスレッド (実際にはまったく別のトピックです) で実行する必要があります。

public class BackgroundTask implements Runnable { // extends Thread {

    public void run() {
        for (int i = 0; i < noQueries; i++) {
            runDatabaseQuery(i);
            updateProgress(i);
        }
    }

    private void updateProgress(final int queryNo) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                statusLabel.setText("Query: " + queryNo);
            }
        });
    }
}

2番目のポイントに対処するには:

はいといいえ。このJFrameクラスは、メイン アプリケーションを終了するために使用できるdefaultCloseOperationを提供します。

ただし、表示するのが他のタイプのウィンドウだけの場合は、はい、 JVM を終了するためJDialogに呼び出す必要があります。System.exit

サポートされている場合は、WindowListener.windowClosedイベントを使用して、ウィンドウが閉じられるタイミングを監視し、適切なアクションを実行できます。

于 2012-08-29T06:04:55.907 に答える
2

アプリケーションでメインJFrameを閉じるには、System.exit(); を呼び出す必要があります。ただし、メインJFrameでアプリケーション自体を閉じることができます。

setDefaultCloseOperation(EXIT_ON_CLOSE);

ModalJDialogは、呼び出し元のスレッドをブロックしています。ただし、これには利点があります。アクションを実行するためにユーザーの回答に依存する場合はJDialog、それを待つ必要があります。

于 2012-08-29T06:04:45.823 に答える