通过侦听SWT浏览器更改运行映射的java方法

时间:2017-03-01 17:32:38

标签: javascript java multithreading swing swt

我在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();"这意味着Javascript方法调用。 setTime()在页面上,fieldChanged()映射在Java代码中。

在java中映射javascript函数 - 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系统上,在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;
            }
        };
    }

new BrowserFunction(..)

上抛出SWTException

1 个答案:

答案 0 :(得分:0)

<强>解决

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

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

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