.show()
デッドロックを回避するためにメインスレッドでフレームを作成するべきではないことを読みましたが、これは本当の問題ですか。これは常に避けるべきですか?また、ProgressMonitorInputStream などの何らかの種類のダイアログ ボックスを表示すると、それが閉じて完了した場合でもSystem.exit()
、アプリを強制終了するために呼び出す必要がありますか? JDialogはどうですか?
2 に答える
デッドロックを回避するために、メインスレッドで .show() フレームを使用しないでください。
その本/投稿/ウェブページを読むのをやめます。
最初のポイントに対処するには:
見落としている点もあるかと思います。
すべての UI コードは、イベント ディスパッチ スレッド(EDT) で実行する必要があります。これには、まだ画面に表示されていない UI コンポーネントも含まれます。
EDT で時間のかかるタスクを実行しないでください。これにより、画面が更新されなくなり、アプリケーションが応答しなくなります。これは、ユーザーが本当に嫌うものです。
時間のかかるタスクは、 SwingWorkerやSwingUtilities.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イベントを使用して、ウィンドウが閉じられるタイミングを監視し、適切なアクションを実行できます。
アプリケーションでメインJFrame
を閉じるには、System.exit(); を呼び出す必要があります。ただし、メインJFrame
でアプリケーション自体を閉じることができます。
setDefaultCloseOperation(EXIT_ON_CLOSE);
ModalJDialog
は、呼び出し元のスレッドをブロックしています。ただし、これには利点があります。アクションを実行するためにユーザーの回答に依存する場合はJDialog
、それを待つ必要があります。