3

どちらも同じ結果を生成するため、この2つのコードの実際の違いは何ですか?

コード 1:

public class JLabelDemo extends JApplet {
public void init() {
    this.setSize(400, 400);
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

コード 2:

public class JLabelDemo extends JApplet {
private static final long serialVersionUID = 1L;

public void init() {
    this.setSize(400, 400);
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                makeGUI();
            }
        });
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void makeGUI() {
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

生成された出力に違いはありませんでした。しかし、私はコードを理解できません。

では、invokeAndWait メソッドの実際の例を誰か教えてもらえますか??

4

3 に答える 3

2

code1 の場合、init() を呼び出すスレッドで 2 つの割り当てと追加が実行されます。これがイベント ディスパッチ スレッドでない場合は、問題がある可能性があります。Swing のドキュメントには、Swing のほとんどすべての使用はイベント ディスパッチ スレッドで行う必要があると記載されているためです。

コード 2 の場合、Swing の呼び出しは、イベント ディスパッチ スレッドで行われることが保証されています。これが正しいやり方です。これは見苦しく複雑で、(まだ) 理解できていませんが、init() が EDT 以外のスレッドで呼び出される場合は、これが正しい方法です。

于 2013-04-03T13:02:10.703 に答える
1

invokeAndWaitそのコード ブロックを別のスレッドで実行するため、実行中にメイン スレッドをブロックしないことを意味します。Swing GUI の作成に使用されます。

于 2013-04-03T12:57:49.767 に答える
0

小さなスイング アプリケーションでは違いは見られません。UI の描画に時間がかかる大規模なアプリケーションや、複数のスレッドがアプリケーションに関与しているアプリケーションでは、違いを確認できます。

javadoc から

invokeAndWait により、doRun.run() が AWT イベント ディスパッチ スレッドで同期的に実行されます。この呼び出しは、保留中のすべての AWT イベントが処理されて (その後) doRun.run() が戻るまでブロックされます。このメソッドは、アプリケーション スレッドが GUI を更新する必要がある場合に使用する必要があります。EventDispatchThread から呼び出すべきではありません。

こちらからもご確認いただけます

于 2013-04-03T13:04:45.213 に答える