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,就像在代码示例中一样?

4

1 回答 1

0

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

于 2015-07-17T09:45:40.703 回答