运行 映射 java 方法并监听 SWT 浏览器变化

Running mapped java method with listen to SWT Browser changes

我在 Java 项目中使用了 SWT Eclipse 浏览器。

我创建的测试页面如下:

<!DOCTYPE html>
<html>
<body>

Start: <input type="text" id="startTimeField" onchange="setTime();fieldChanged();" placeholder="Type text and press Enter"> ms

<script>
    function setTime() {
        document.getElementById('startTimeField').value = new Date().getMilliseconds();
     }
</script>

</body>
</html>

onchange="setTime();fieldChanged();" 表示 Java 脚本方法调用。 setTime() 在页面上,fieldChanged() 映射在 Java 代码中。

映射的 java 脚本函数 - java 中的 fieldChanged() 如下:

private void startListen() {
    SWTRunner.runInSwtThread(() -> new BrowserFunction(getSwtBrowser().getBrowser(), "fieldChanged") {
                @Override
                public Object function(Object[] objects) {
                    swtResultField.setText("" + new Date().getTime() % 1000);
                    return null;
                }
            });
}

我在哪个线程上遇到问题 运行 java 代码中的映射函数? 我按照上面的代码尝试 - 运行 它在 SWTRunner.runInSwtThread() 和 OS X 系统上运行良好,但在 Windows 系统上 return SWTException: Invalid thread access在线 new BrowserFunction(...).

我应该 运行 在哪个线程上映射 Java 中的函数以避免 Windows 系统中的异常?

编辑

正如@greg-449 所说,我编辑并调用了该方法,但在 Windows 系统上也出现错误,该方法如下所示:

private void startListen() {
        new BrowserFunction(getSwtBrowser().getBrowser(), "fieldChanged") {
            @Override
            public Object function(Object[] objects) {
                getSwtBrowser().getBrowser().getDisplay.asyncExec(() -> swtResultField.setText("" + new Date().getTime() % 1000));
                return null;
            }
        };
    }

SWTException 在 new BrowserFunction(..)

上抛出

已解决

问题出在线程依赖于操作系统。

在 Windows 上必须是 运行 在 Display.asyncExec() 上。

在 OS X 必须是 运行 在 SWTRunner.runInSwtThread()