在一个基于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是有意义的?
1 回答
在SWT中,必须在UI线程内创建/处理/访问每个UI元素,因为在发送系统信号之前存在
checkWidget
方法调用 . 此方法检查当前线程是否是UI线程并抛出错误 . 这种选择背后的原因是图形上下文访问是 single 线程,这也适用于摆动 . 因此,您必须在EventQueue
线程中使用Display.syncExec(....)
或Display.asyncExec(....)
和SWING的SWT调用每个小部件处理其正确的线程