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