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

How to Listen to Vaadin component events in a JavaFX WebView?

我使用 Vaadin Flow(Vaadin 版本 21)创建了一个带有保存按钮的表单。然后,此表单显示在 JavaFX WebView(版本 17.0.1)中,现在我想收听来自 JavaFX 的保存按钮等表单中的事件,因此我可以更新应用程序的 JavaFX 部分。我见过这样的例子:

How to retrieve components from HTML webview in JavaFX

但是它们不起作用,因为 doc.getElementById("xxx") 根本不起作用并且 returns 为空。如果我使用那里描述的 xpath 方法,我确实得到了按钮元素,但随后通过调用

添加了监听器
((EventTarget) button).addEventListener("click", e -> doSomeAction(), false);

没有帮助。当我单击按钮时,Vaadin 侦听器工作但“javafx”侦听器没有收到事件。

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

您可以通过向上调用从 Java 脚本调用 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);

有关上行电话的更多信息 here