9

Java で新しい を作成して表示するには、次のJFrameようにします。

public static void main(String[] args) {
   new MyCustomFrameClass().setVisible(true);
}

しかし、私は多くの人がこのようにそれをしているのを見てきました:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MyCustomFrameClass().setVisible(true);
       }
    });
}

なんで?何か利点はありますか?

4

2 に答える 2

7

EDT で何を実行する必要があるかを管理するルール (「イベント キュー」よりも「EDT」の方がよく使用されるようです) は、Java の存続期間中に変更されました。そして、「ルール」が変更されるたびに、Sun は EDT で「GUI 関連」の作業をますます行うようにアドバイスしました。

EDT で Java GUI を実行するのはなぜですか?

  • 公式のガイドラインがそうするように勧めているからです。

  • そうすることで、GUI に関連する多くのスレッド化バグを回避するのに役立つからです。

Swing 自体にいくつかのバグがあるため、EDT が実際に時々クラッシュすることはあまり知られていないことに注意してくださいすべての重要な Swing アプリケーションは、バグのある Swing API を使用しているため、EDT が機能しなくなることがあります。

EDT が停止すると、自動的に再起動されるため、これが表示されることはなく、心配する必要もありません。

基本的に、EDT ですべての GUI 関連の操作を行い、EDT の外部ですべての長時間の操作を行います (EDT をブロックしないように)。

EDT の外で長時間の操作を実行する方法の例を求めたEDIT 。これを行うにはいくつかの方法があります。最も単純なケースでは、EDT から新しいスレッドを作成して開始するだけです。1 つの例を次に示します。ユーザーがボタンをクリックすると、リスナー コールバックが呼び出されます。これは EDT で発生することがわかっています...

    JButton jb = ...
    jb.addActionListener( new ActionListener() {
        public void actionPerformed( final ActionEvent e ) {
          final Thread t = new Thread( new Runnable() {
           public void run() {
             // this shall get executed, after start() has been called, outside the EDT    
             }
           });
           t.start();
        }
    } );

より複雑な例については、SwingWorkerなどを参照してください。

于 2010-06-10T21:28:19.833 に答える
3

カスタム フレームは のサブクラスであるため、この行は Swing コンポーネントを変更していますJFrame

new MyCustomFrameClass().setVisible(true);

通常、Event Dispatch Thread (EDT) を使用していない限り、Swing コンポーネントを変更しないでください。

次のコードはRunnable、EDT の内容を実行します。

EventQueue.invokeLater(Runnable);

これで、setVisible(true)通話は本来の EDT で行われます。

于 2010-06-10T20:33:25.177 に答える