JavaFX + WebView / Javascript:setTimeOut不起作用调用堆栈来自Java

时间:2015-03-25 16:41:39

标签: java javascript javafx-8 javafx-webengine

我有一个JavaFX应用程序,它在WebView中加载我自己的HTML / JS应用程序。根据事件的不同,我需要从Java调用Javascript,从Javascript调用Java。

从JS到Java的每一个都很好,但是从Java到Javascript时我都有很奇怪的行为。

  • 基本上,我是如何设置两种语言之间的通信的:

_

var javaObjectInjected = typeof javaObject !== "undefined";

if(javaObjectInjected && !javaObjectInitialized) {
    jThalesEventBusInitialized = true;

    const jsAdapter = {
        publishToJs: onPublishToJs
    };

    javaObject.setJsAdapter(jsAdapter);
}
  • 我的Java代码将调用提供的publishToJs上的方法jsAdapter。这将导致执行onPublishToJs

_

function onPublishToJs(topic, data) {
    alert('Yeah! We are inside JS'); //output_1

    setTimeout(
        function() {
            alert('inside setTimeOut'); //output_2
        },
        1000
    );
}

我确实得到了output_1但没有得到output_2。就像setTimeOut上的回调被丢弃一样。

从Java调用JS时是否存在任何已知限制?

1 个答案:

答案 0 :(得分:0)

我重构了我的代码,而不是使用jsAdapterjavaObject.setJsAdapter(jsAdapter)注入Java世界,而是将jsAdapter作为window的新成员公开给了{。}。

使用这种新的代码结构,我从Java调用jsAdapter时遇到异常,因为我是从EDT而不是JavaFX Application Thread进行的。

最后,我将jsAdapter电话打包在Platform.runLater(() -> ...)中,就是这样。

使用从JavaFX WebView加载的Javascript时,请确保始终从JavaFX应用程序线程执行Javascript调用。