如何创建一个JavaScript包装与JavaFx WebView使用?JSNI是一种选择吗?

How to create a JavaScript wrapper to be used with JavaFx WebView? Is JSNI an option?

本文关键字:JSNI 选择 使用 WebView 一种 包装 创建 何创建 一个 JavaScript JavaFx      更新时间:2023-09-26

我想将JavaFx WebEngine与JavaScript库d3.js结合使用。我已经能够从Java中访问JavaScript库。它使用jsoobjects工作,如[1]:

所示
JSObject d3Object = (JSObject) webEngine.executeScript("d3");
JSObject chart= (JSObject) d3Object.call("select", ".chart");

正如你所看到的,有一个通用的方法"call",我必须传递我想要调用的JavaScript方法的名称作为字符串。为了更舒适地使用JavaScript库d3.js,我想为它提供一个Java包装器,例如

JSObject d3Object = (JSObject) webEngine.executeScript("d3");
D3Wrapper d3 = new D3Wrapper(d3Object);
Selection chart = d3.select(".chart");

创建这样一个JavaScript包装器的推荐方法是什么?我发现已经有一个针对GWT应用程序的D3包装器。d3对象的主要包装器位于这里:

https://github.com/gwtd3/gwt-d3/blob/master/gwt-d3-api/src/main/java/com/github/gwtd3/api/D3.java

它似乎是基于JSNI[2],一个示例方法定义是

public static final native Selection select(String selector)/*-{
    return $wnd.d3.select(selector);
}-*/;

注释中的本机代码将在从Java内部调用该方法时执行。如何利用JavaFx桌面应用程序中现有的包装器代码?我以前从未使用过GWT,也不想运行额外的web服务器。我真的需要深入研究GWT并在JavaFx WebEngine中运行完整的GWT应用程序吗(如果可能的话)?或者我可以只使用GWT的JSNI部分与JavaFx WebEngine一起使用吗?

这是一篇关于GWT调试模式的文章,它看起来相当复杂:http://www.quora.com/How-does-GWT-live-javascript-debugging-in-Eclipse-work-and-how-could-it-be-applied-to-Clojure所以恐怕没有简单的方法将WebEngine插入到这样的工作流程中?我真的需要手动重写每个包装类"已经由gwt-d3提供"吗?如果本机JavaScript代码由注解提供,我可以重用gwt-d3中的包装器类,并通过反射处理它们。

如果将JSNI与JavaFx结合没有任何意义,那么为d3.js编写自己的包装器的优雅方式是什么?是否有Java库可以帮助我编写JavaScript包装器?

结果证明JSNI不是(可行的)选项。我决定从gwt-d3的现有包装器代码开始,并将其转换为搜索和替换操作……做一些手动微调。这样它就不再适用于GWT,而是适用于JavaFx。我将为转换后的代码创建一个新的GitHub项目。

我的包装器类继承了一个抽象基类JavaScriptObject,它与JavaFx WebEngine对话并处理JSObject操作。与gwt-d3作者的相关讨论可以在这里找到:https://github.com/gwtd3/gwt-d3/issues/124

编辑

我刚刚创建了一个新的GitHub项目: https://github.com/stefaneidelloth/javafx-d3

请随时加入并帮助修复剩余的错误。