首页 文章

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

提问于
浏览
0

在一个基于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

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

相关问题