3

なぜこのようなコードを書く必要があるのか​​という簡単な質問があります

SwingUtilities.invokeLater(new Runnable(){

プログラムがそれなしで同じフレームを作成する場合は?

SwingUtilities を使用したコード

import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class App {
    public static void main (String args[]){    
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame("Hello world swing"); 
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(300, 400);        
            }
        });
    }
}

スイングユーティリティなしのコード。

import javax.swing.JFrame;

public class App {
    public static void main (String args[]){    
        JFrame frame = new JFrame("Hello world swing");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 400);
    }
}
4

1 に答える 1

4

Swing はスレッドセーフではなく、シングルスレッドです。コンポーネントの作成、更新、およびレンダリングは、イベント ディスパッチ スレッド (EDT) に依存しています。

http://en.wikipedia.org/wiki/Event_dispatching_threadを参照

SwingUtilities.invokeLater基本的SwingUtilities.invokeAndWaitにSwing関連のタスクをEDTに入れるためのユーティリティメソッドです。

そうしないと、最終的に失敗する可能性があります。アプリケーションが大きくなるにつれて、奇妙な結果が表示されます。

GUI(SWING)関連の操作は必ずEDT上で行ってください。

また、ほとんどの GUI はシングルスレッドです。スウィングもそうです。したがって、複数のスレッドから Swing にアクセスしようとすると、アプリケーションが失敗するリスクが高くなります。これを読んで ください http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

コードでは、Swing 操作 (JFrame の作成) がメイン スレッドで実行されていますが、これはお勧めできません。を使用しSwingUtilities.invokeLater()ます。

于 2013-07-16T09:36:54.537 に答える