如何在 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。
我使用 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。