0

大規模な SWT ベースのアプリケーションに取り組んでいるときに、AWT/Swing ブリッジを使用するコードに出くわし、完全に混乱し、2 つの GUI スレッドを使用することの意味について考えさせられました。

public void createContent(final String html) {
    // Bridge to AWT
    frame = SWT_AWT.new_Frame(this);
    rootPane = new JPanel();
    rootPane.setLayout(new GridBagLayout());
    JRootPane rp = new JRootPane();
    rp.getContentPane().add(rootPane);
    rp.validate();
    frame.add(rp);
    frame.validate();

    // Create components in AWT user interface thread (deadlock prevention)
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            initializeLookAndFeel();
            initializeToolbar();
            initializeHTMLEditor();
            setHTML(html, false);
        }
    });

    rootPane.repaint();
    rootPane.validate();
}

詳細は省きますが、ご想像のとおり、多くの Swing 要素が初期化メソッド内の「ブリッジ フレーム」に追加されます。

この場合、混乱するのは、Swing コンポーネントを作成するための AWT イベント ディスパッチャー スレッド (EDT) の呼び出しです。すべての GUI 要素を SWT UI スレッド内に追加しただけです。GUI の作成を両方のスレッドに分割することが望ましい理由がわかりません。

おそらく、誰かが舞台裏で何が起こっているかを詳しく説明できるでしょう. 特に、ブリッジを使用した両方のスレッドの相互作用について。コード例のように、AWT の作成を EDT にディスパッチするのは、なぜ、またはいつですか?

4

1 に答える 1

0

checkWidgetSWT では、システム シグナルを送信する前にメソッド呼び出しがあるため、すべての UI 要素を UI スレッド内で作成/処理/アクセスする必要があります。このメソッドは、現在のスレッドが UI スレッドかどうかをチェックし、エラーをスローします。この選択の背後にある理由は、グラフィカル コンテキスト アクセスがシングルスレッドであり、これがスイングにも当てはまるためです。したがって、適切なスレッド内で処理するすべてのウィジェットを呼び出す必要がありますDisplay.syncExec(....)Display.asyncExec(....)EventQueue

于 2015-07-17T09:45:40.703 に答える