Javascript javafxwebview:can';t让JS桥在Java11+中工作;

Javascript javafxwebview:can';t让JS桥在Java11+中工作;,javascript,java,javafx,java-11,java-13,Javascript,Java,Javafx,Java 11,Java 13,我无法让Java/Javascript桥在Java11和Java13上工作。在Java8和Java10中,该桥似乎工作良好 这里的代码与基本相同,同样适用于Java8和Java10: 导入java.io.File; 导入java.net.MalformedURLException; 导入java.net.URL; 导入javafx.application.application; 导入javafx.concurrent.Worker.State; 导入javafx.scene.control.B

我无法让Java/Javascript桥在Java11和Java13上工作。在Java8和Java10中,该桥似乎工作良好

这里的代码与基本相同,同样适用于Java8和Java10:

导入java.io.File;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javafx.application.application;
导入javafx.concurrent.Worker.State;
导入javafx.scene.control.ButtonType;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebEvent;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
导入netscape.javascript.JSObject;
公共类主扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
爪哇桥;
网络引擎;
@凌驾
public void start(Stage primaryStage)引发错误的DurLexException{
最终URL=新文件(“C:/test.html”).toURI().toul();
WebView WebView=newjavafx.scene.web.WebView();
webEngine=webView.getEngine();
load(url.toExternalForm());
setJavaScriptEnabled(true);
setOnAlert(Main::showAlert);
webEngine.getLoadWorker().stateProperty().addListener((ov、oldState、newState)->{
if(newState==State.successed){
System.out.println(“就绪”);
JSObject jsobj=(JSObject)webEngine.executeScript(“窗口”);
bridge=newjavabridge();
jsobj.setMember(“桥”,桥);
}
});
setScene(新的javafx.scene.scene(webView,300300));
primaryStage.show();
}
//显示JS catch语句中使用的警报
私有静态void showAlert(WebEvent事件){
javafx.scene.control.Dialog alert=新建javafx.scene.control.Dialog();
alert.getDialogPane().setContentText(event.getData());
alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
alert.showAndWait();
}
公共类JavaBridge{
公共空间{
System.out.println(“你好”);
}
}
}
使用包含Javascript的
test.html

调用java
发生什么事了

单击按钮时出现以下错误:


bridge.hello不是一个函数。(在“bridge.hello()”中,“bridge.hello”未定义)

我无法使用Java11(OpenJDK 11.0.2)或Java13(OpenJDK 13)重现JavaFX13或14 ea+6的问题

但是,如果我删除对
JavaBridge
的强引用并使用Java11,我可以重现这个问题

这:

失败,错误与您发布的Java 11相同。但是,当使用Java13(OpenJDK13)时,它工作得很好(Java12也是如此)


您正在使用其他Java供应商吗?你能试试OpenJDK吗?

你的代码是模块化的吗?如果传递给JavaScript的任何Java类位于命名模块中,则javafx.web模块必须可以反射式访问该类。如果模块打开包含至少javafx.web模块的包,则该类可以反射式访问。否则,将不会调用该方法,并且不会产生错误或警告–。@Slaw我遵循了a的说明,所以没有。该指南提到将
--添加模块javafx.controls,javafx.fxml
作为VM选项,您是否也将
javafx.web
模块添加到模块列表中?
jsobj.setMember("bridge", new JavaBridge());