我有一个 JavaFX WebView,想要从 Web 视图中显示的“test.html”调用“JavaBridge”类的方法“hello”。
为什么这不起作用?我确保“桥”对象仅在页面完全呈现时添加到 window.object,因此这可能不是问题。我也看不出 HTML 有什么问题。
这是 HTML 代码(“test.html”):
<html>
<head>
</head>
<body>
<a href="#click" onclick="bridge.hello()">call java</a>
</body>
</html>
这是 Java 代码:
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
java.net.URI uri = java.nio.file.Paths.get("test.html").toAbsolutePath().toUri();
WebView root = new javafx.scene.web.WebView();
root.getEngine().load(uri.toString());
root.getEngine().
getLoadWorker().
stateProperty().
addListener(new ChangeListener < State > () {
@Override public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == Worker.State.SUCCEEDED) {
System.out.println("READY");
JSObject jsobj = (JSObject) root.getEngine().executeScript("window");
jsobj.setMember("bridge", new JavaBridge());
}
}
});
primaryStage.setScene(new javafx.scene.Scene(root, 800, 600));
primaryStage.show();
}
}
class JavaBridge {
public void hello() {
System.out.println("hello");
}
}
在 Java 10.0.2 上使用此桥接功能时,我注意到它运行不正常。 Javascript 向上调用并不总是有效。
经过研究,我发现了与 Java 垃圾收集器相关的 OpenJDK bug,这似乎也发生在常规 JDK 上:https://bugs.openjdk.java.net/browse/JDK-8170085
确实,根据https://docs.oracle.com/javase/9/docs/api/javafx/scene/web/WebEngine.html,建议将桥存储到变量中以避免Java GC收集对象。
向类添加私有变量后,JS 到 Java 的调用开始在我的应用程序中一直工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)