web-dev-qa-db-ja.com

SwingUtilities.invokeLaterとは

重複の可能性:
SwingUtilities.invokeLaterは何をしますか?
SwingUtilities.invokeLater

私はこの小さなコードを何百回も見ました:

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

今私の質問です:invokeLater()は何をしますか?メインスレッド内にGUIを作成して表示しただけでは、どのような問題が発生しますか?

14
11684

guidelines に従ってEDTから更新しても問題はありません。

あれは...

イベントディスパッチスレッド(JButtonのActionListenerなど)からinvokeLaterが呼び出された場合、doRun.run()は、保留中のすべてのイベントが処理されるまで延期されます。

ソース

そうでない場合は、invokeLater()が必要です。

EDT(イベントディスパッチスレッド)で実行されるRunnableをスケジュールします。

3
nullpotent

1。_Event Dispatcher Thread_はGUIスレッドです。

2。あなたがmain() method...について話しているなら、それから長くは続かないin Java Guimain()メソッドは、EDTでGUIの構築をスケジュールした後、終了しましたが、現在はGUIを処理するEDT

3。invokeLaterは、この呼び出しがすぐに戻ることを意味しますイベントがイベントディスパッチャーキューに配置され、run()メソッドが非同期で実行される...

11

Swingはスレッドセーフではなく、Swingオブジェクトに対するすべての変更は、イベントディスパッチスレッド内で実行する必要があります。その外でコードを実行しようとすると、不特定の動作が発生します。これはおそらくどこかでおかしくなります。

対照的に、Eclipseが使用するSWT/JFace GUIフレームワークは、各パブリックエントリポイントで正しいスレッドをアサートします。

5
Marko Topolnik