JxBrowser 6.1 JavaScript Java桥API不工作
我认为JxBrowser 6.1中的JavaScriptJavaBridgeAPI存在问题。我尝试了一个非常简单的代码来调用Javascript中java类的方法。这是密码。在java中,JxBrowser 6.1 JavaScript Java桥API不工作,java,api,bridge,jxbrowser,Java,Api,Bridge,Jxbrowser,我认为JxBrowser 6.1中的JavaScriptJavaBridgeAPI存在问题。我尝试了一个非常简单的代码来调用Javascript中java类的方法。这是密码。在java中,java被设置为javascriptwindow对象上的一个属性,作为Events类的一个实例,然后加载html。在html中,我只需调用Events类的Close方法。但是,当我单击Close按钮时,javaClose函数没有被调用,控制台中有一条来自JxBrowser的消息: 未捕获类型错误:无法读取未定义
java
被设置为javascriptwindow
对象上的一个属性,作为Events
类的一个实例,然后加载html。在html中,我只需调用Events
类的Close
方法。但是,当我单击Close
按钮时,javaClose
函数没有被调用,控制台中有一条来自JxBrowser的消息:
未捕获类型错误:无法读取未定义的属性“Close”
这意味着未定义window
对象的java
属性
Main.java:
public class Main extends Application {
private Browser browser;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Platform.setImplicitExit(false);
browser = new Browser();
JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("java", new Events());
BrowserView browserView = new BrowserView(browser);
StackPane pane = new StackPane();
pane.getChildren().add(browserView);
Scene scene = new Scene(pane, 330, 470);
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.setScene(scene);
primaryStage.show();
browser.loadURL(Main.class.getResource("templates/simple.html").toExternalForm());
}
}
class Events {
public void Close() {
System.out.println("close button clicked");
}
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<button id="Close">Close</button>
<script>
document.getElementById('Close').onclick = function () {
window.java.Close();
}
</script>
</body>
</html>
simple.html:
public class Main extends Application {
private Browser browser;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Platform.setImplicitExit(false);
browser = new Browser();
JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("java", new Events());
BrowserView browserView = new BrowserView(browser);
StackPane pane = new StackPane();
pane.getChildren().add(browserView);
Scene scene = new Scene(pane, 330, 470);
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.setScene(scene);
primaryStage.show();
browser.loadURL(Main.class.getResource("templates/simple.html").toExternalForm());
}
}
class Events {
public void Close() {
System.out.println("close button clicked");
}
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<button id="Close">Close</button>
<script>
document.getElementById('Close').onclick = function () {
window.java.Close();
}
</script>
</body>
</html>
接近
document.getElementById('Close').onclick=function(){
Close();
}
下面是我用来做这件事的文章:
如果我错了,请纠正我。
提前感谢。请确保在访问其JavaScript和注册Java对象之前加载所需的网页。例如:
browser.addLoadListener(new LoadAdapter() {
@Override
public void onFinishLoadingFrame(FinishLoadingEvent event) {
if (event.isMainFrame()) {
Browser browser = event.getBrowser();
JSValue value = browser.executeJavaScriptAndReturnValue("window");
value.asObject().setProperty("Account", new Account());
}
}
});
browser.loadURL("form.html");
谢谢,我这样做了,它以某种方式解决了问题,但出现了另一个错误:“Uncaught IllegalAccessException:Class com.teamdev.jxbrowser.chromium.JSContext无法访问带有修饰符“public”的类RezRem.Events的成员”“。对于这个错误,我用
public
修饰符在另一个文件中声明了Events
类,现在没有问题了。JavaScript只能访问公共类和方法。请检查最近添加的注释,谢谢;)