0

我遇到了 JavaFX 中的 WebEngine 类的问题,其中 JavaScript 回调似乎停止工作。

webEngine = webView.getEngine();
webEngine.load(getClass().getResource("source.html").toString());
webEngine.setUserStyleSheetLocation(getClass().getResource("style.css").toString());

JSObject js = (JSObject) webEngine.executeScript("window");
js.setMember("app", new JavaLink());

public class JavaLink{
        public void setDrag(boolean drag) {
            System.out.println(drag);
        }
    }

我像这样设置基本代码,在 WebEngine 上使用 oracle 文档并创建了一个包含以下部分的 html 文件:

<body>
    <div id = "block">Text</div>

    <script>
        document.getElementById("block").onmouseover = function() {notifyPos()};
        document.getElementById("block").onmouseout = function() {notifyNeg()};

        function notifyPos() {
            app.setDrag(true);
        }

        function notifyNeg() {
            app.setDrag(false);
        }
    </script>
</body>

因此,每当我将鼠标悬停在“文本”上时,它都会打印出真假。问题是在徘徊一段时间后它就停止工作了。我不知道为什么,但通过 CSS 向 html 文件添加背景图像似乎将其限制为大约十个回调(这似乎与时间相关)。

编辑

好的,在另一台 PC 上测试代码片段后,我注意到代码根本不起作用。如果有人遇到过类似的问题,这就是解决它的方法:

进口:

import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;

添加代码:

webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {    @Override
                public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) {
                    if (t1 == Worker.State.SUCCEEDED) {
                        // this will be run as soon as WebView is initialized.
                        JSObject js = (JSObject) webEngine.executeScript("window");
                        js.setMember("app", new JavaLink());

                    }
                }
            });

我现在遇到的问题是,这段代码可以在我的笔记本(相同的 Java 版本、IDE、插件...)上运行,但在我的 PC 上却不行。它仍然只适用于大约十次鼠标悬停。有谁知道它可能是什么?

4

1 回答 1

2

为我的电脑修复了它,因为这显然不起作用,或者如果有人想澄清发生了什么,垃圾收集会删除链接。

js.setMember("app", new JavaLink());

我添加修复的代码是预先分配链接。

JavaLink link = new JavaLink();
js.setMember("app", link);
于 2017-08-29T08:17:29.053 回答