1

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

如何从 JavaFX 中的 HTML webview 中检索组件

但它们不起作用,因为doc.getElementById("xxx")根本不起作用并返回 null。如果我使用那里描述的 xpath 方法,我确实得到了按钮元素,但是通过调用添加侦听器

((EventTarget) button).addEventListener("click", e -> doSomeAction(), false);

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

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

4

1 回答 1

1

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

更多关于 upcalls在这里

于 2021-11-21T00:14:30.987 回答