大規模な 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 にディスパッチするのは、なぜ、またはいつですか?