提问者:小点点

如何在JavaFX WebView中监听Vaadin组件事件?


我使用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”侦听器没有获得事件。

所以我的问题是这个用例是否有已知的解决方案?


共1个答案

匿名用户

您可以通过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);

更多关于这里的电话。