我用Vaadin Flow(Vaadin版本21(创建了一个带有保存按钮的表单。这个表单随后显示在JavaFX WebView(17.0.1版(中,现在我想从JavaFX中收听表单中的事件,比如保存按钮,这样我就可以更新应用程序的JavaFX部分。我见过这样的例子:
如何在JavaFX 中从HTML Web视图中检索组件
但是它们不起作用,因为doc.getElementById("xxx")
根本不起作用并且返回null。如果我使用上面描述的xpath方法,我确实得到了button元素,但随后通过调用添加监听器
((EventTarget) button).addEventListener("click", e -> doSomeAction(), false);
没有帮助。当我点击按钮时,Vaadin监听器工作;javafx";监听器没有得到事件。
所以我的问题是,这个用例是否有已知的解决方案?
您可以通过上调用从JavaScript调用Java方法。它通过将JavaScript对象分配给Java对象来工作:
JSObject jso = (JSObject)webEngine.executeScript("window");
jso.setMember("java", new JavaObj());
完整示例:
public class JavaObj {
public void myMethod() {
...
}
}
webEngine.setJavaScriptEnabled(true); // Obviously...
webEngine.getLoadWorker().stateProperty().addListener((observable, oldState, newState) -> {
if(newState == Worker.State.SUCCEEDED) {
JSObject jso = (JSObject)webEngine.executeScript("window");
jso.setMember("java", new JavaObj());
}
});
((EventTarget) button).addEventListener("click", e -> UI.getCurrent().getPage().executeJs("java.myMethod()"), false);
点击此处了解更多关于升级的信息。