在大型基于 SWT 的应用程序上工作时,我偶然发现了一些使用 AWT/Swing 桥的代码,这完全让我感到困惑,并让我思考使用两个 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 元素被添加到初始化方法内部的“桥框架”中。
在这种情况下让我感到困惑的是调用 AWT 事件调度线程 (EDT) 来创建 Swing 组件。我会在 SWT UI 线程中添加所有 GUI 元素。我不确定为什么最好在两个线程之间拆分 GUI 创建。
可能有人可以详细说明幕后发生的事情。特别是在使用桥接的两个线程的交互上。为什么或何时将 AWT 内容的创建分派给 EDT,就像在代码示例中一样?