3

「イベント発送スレッド」について質問があります。JFrameでもあるメインクラスがあります。コード内の残りのコンポーネントを初期化します。それらの一部は Swing を使用せず、一部は使用します。このようにEDTを使用してメインクラスを初期化するだけで十分ですか?...

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Main();
        }
    });
}

このようにして、すべてが Event Dispatcher スレッドで実行されます。

4

4 に答える 4

6

計算やデータ取得などにバックグラウンド スレッドを使用し始めるまでは、通常はこれで十分です。その後、Swing コンポーネントまたはそのモデルを変更する前に、EDT を使用していることを注意深く確認する必要があります。

EDT で実行しているかどうかは、次の方法でテストできます。

    if (SwingUtilities.isEventDispatchThread()) {
        // Yes, manipulate swing components
    } else {
        // No, use invokeLater() to schedule work on the EDT
    }

また、作業をバックグラウンド スレッドに渡し、EDT で結果を処理する方法の詳細については、 SwingWorkerクラスを参照してください。

于 2010-03-30T20:07:05.150 に答える
2

これが進むべき道です。注意すべき唯一のことは、Swing コンポーネントに登録したリスナーが新しいスレッドを生成するかどうかです (多くの場合、長い計算を実行するため)。このような新しいスレッドはinvokeLater、GUI 操作を実行する場合に使用する必要があります。

于 2010-03-30T20:04:28.230 に答える
2

これは、Sun チュートリアルのすべての例が機能する方法です。なぜこのように行われるのかについての詳細は、並行性に関するSwing チュートリアルのセクションを参照してください。

于 2010-03-30T20:07:33.507 に答える