我在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(..)
行
答案 0 :(得分:0)
<强>解决强>
问题在于线程依赖于操作系统。
在Windows上必须在Display.asyncExec()
上运行。
在OS X上必须在SWTRunner.runInSwtThread()
上运行。