结合SWT和AWT / Swing:要采用哪个GUI线程?

时间:2015-01-28 17:34:16

标签: java user-interface event-dispatch-thread ui-thread swt-awt

在基于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 个答案:

答案 0 :(得分:0)

在SWT中,必须在UI线程中创建/处理/访问每个UI元素,因为在发送系统信号之前存在checkWidget方法调用。此方法检查当前线程是否是UI线程并抛出错误。这种选择背后的原因是图形上下文访问是线程,这也适用于swing。因此,您必须在其正确的线程中调用每个小部件处理SWT的小部件Display.syncExec(....)Display.asyncExec(....)EventQueue线程中的SWING