如何在JavaFX WebView中收听Vaadin组件事件



我用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);

点击此处了解更多关于升级的信息。

最新更新