我遇到了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);
}
}
我使用oracle docu on WebEngine设置了这样的基本代码,并使用以下部分创建了一个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>
所以每当我将鼠标悬停在&#34; Text&#34;它会打印出真或假。问题是经过一段时间徘徊,它只是停止工作。我不知道为什么但是通过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,插件......),但不能在我的电脑上使用。它仍然只适用于大约十次鼠标悬停。有谁知道它可能是什么?
答案 0 :(得分:2)
修正了我的电脑,因为它显然没有工作,或者如果有人想澄清发生了什么,垃圾收集会删除链接。
js.setMember("app", new JavaLink());
我添加修复的代码是指定链接。
JavaLink link = new JavaLink();
js.setMember("app", link);