我使用Vaadin Flow(Vaadin版本21)创建了一个带有保存按钮的表单。然后,此表单显示在JavaFX WebView(版本17.0.1)中,现在我想监听表单中的事件,例如来自JavaFX的保存按钮,以便我可以更新应用程序的JavaFX部分。我看到了以下示例:
如何在JavaFX中从超文本标记语言webview中检索组件
但是它们不起作用,因为doc. getElementById("xxx")
根本不起作用并返回null。如果我使用那里描述的xpath方法,我确实得到了按钮元素,但是然后通过调用
((EventTarget) button).addEventListener("click", e -> doSomeAction(), false);
没有帮助。当我单击按钮时,Vaadin侦听器正常工作,但“javafx”侦听器没有获得事件。
所以我的问题是这个用例是否有已知的解决方案?
您可以通过upcall从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);
更多关于这里的电话。