1

Java での GUI のサンプル コードを見ていましたが、GUI を表示する適切な方法を知りたいと思っていました。createAndShowGUI() メソッドが GUI 用に書かれているとします。私はこのようなものを見ました:

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

javax.swing を使用せずに、main メソッドの最後で単に createAndShowGUI() を呼び出すのは間違っていますか? または、私の本当の質問は、ここで何が起こっているかについてだと思います。私はスレッドに精通していますが、GUI を表示するために新しいスレッドを作成する必要がある理由がわかりません (ここで何が起こっているのでしょうか?)。

4

2 に答える 2

2

UI (Swing または AWT) とのすべての対話は、イベント ディスパッチ スレッドのコンテキスト内から実行する必要があります。

Swing (および AWT) コンポーネントはスレッド セーフではありません。EDT 以外のスレッドからそれらのいずれかを変更すると、更新の破損、ペイント アーティフィクス、デッド ロックが発生し、VM がクラッシュする可能性があります。また、デバッグが非常に難しいことでも知られています。

一読してみるのもいいかもしれません

また、mainメソッドが実行されると、VM が作成したスレッドで実行されます。これは、必要になるまで開始されないため、EDT ではないことが保証されています。

これが、優れた Swing プログラムが常に のようなもので始まる理由EventQueue.invokeLaterです。を使用することもできますがSwingUtilities.invokeLater、一般的には同じことです。

于 2012-11-27T04:40:44.370 に答える
1

GUI に関連するすべての処理はイベント ディスパッチ スレッド( EDT ) を介して行う必要があるため、Java はインターフェイスの描画全体をこのように管理します。基本的に、メソッドrun()は渡されRunnableたオブジェクトのメソッドの実行を正しいスレッドに委譲します。

Runnableはないことに注意してください。Threadこれは、何かを実行するメソッドを提供する単なるインターフェースです (したがって、クラスはrunnableです)。しかし、ここにはスレッドが含まれていません。スレッドが何かを実行できるという意味でオブジェクトでもあるThreadからです。RunnableRunnable

于 2012-11-27T04:37:06.097 に答える