当前位置: 首页 > 知识库问答 >
问题:

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

宇文梓
2023-03-14

我希望将JavaFXWebEngine与JavaScript库d3结合使用。js。我已经能够从Java中访问JavaScript库。使用JSObjects工作,如[1]所示:

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

如您所见,有一个通用方法“call”,我必须将要调用的JavaScript方法的名称作为字符串传递。为了使用JavaScript库d3。更舒适的是,我想为它提供一个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因此,恐怕没有简单的方法将Web引擎插入到这样的工作流中?我真的需要手动重写“gwt-d3已经提供”的每个包装类吗?如果本机JavaScript代码由注释提供,我可以重用gwt-d3中的包装类,并通过反射进行处理。

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

共有1个答案

宓诚
2023-03-14

事实证明,JSNI不是(可行的)选择。我决定从gwt-d3中现有的包装器代码开始,并使用搜索和替换操作对其进行转换。。。并进行一些手动微调。这样一来,除了JavaFx之外,它将不再适用于GWT。我将为转换后的代码创建一个新的GitHub项目。

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

编辑

我刚刚创建了一个新的GitHub项目:

https://github.com/stefaneidelloth/javafx-d3

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

 类似资料:
  • 问题内容: 使用Selenium Web测试时,有几种方法可以识别WebElement。 根据我的经验,我使用了以下选择器: 类名 - CSS选择器 - ID - 连结文字 - 名称 - 标签名称 - XPath的 - 显然,当只有一个选项可用于定位元素时,我们必须使用该选项,但是当可以使用多种方法(例如:下面的div)时,应如何确定使用哪种方法呢?是否有比其他选择器 更有效的 选择器?有一些 更

  • 问题内容: 我在Firefox Webdriver上使用Selenium来处理具有唯一CSS ID(在每次加载页面时)的页面上的元素,但是ID每次都会更改,因此无法使用它们来查找元素。这是因为该页面是使用ExtJS构建的Web应用程序。 我正在尝试使用Firebug获取元素信息。 我需要找到一个唯一的xPath或选择器,以便可以使用Selenium分别选择每个元素。 当我使用Firebug复制xP

  • 问题内容: 我想在创建PHP PDO对象之后选择要使用的MySQL数据库。我该怎么做呢? 有等于mysqli :: select_db的PDO吗? 也许我试图不当使用PDO?请帮助或解释。 编辑 我不应该使用PDO创建新数据库吗?我知道使用PDO的大部分好处会因为很少使用的操作而丢失,该操作不会插入数据,例如,但是不得不使用其他连接创建数据库,然后创建PDO连接进行其他调用似乎很奇怪。 问题答案:

  • 问题内容: 我是django的新手。我正在使用简单的ajax 根据 课程* 选择动态更新选择领域 学期 。但是在提交表格时,我收到错误消息,请 选择一个有效的选择。 所选选项 不是可用选项之一。 代码如下: __* forms.py: views.py: loginForm.html: 请帮帮我。 问题答案: 问题是,要求所选选项位于其选择集中。 在上面的代码中,的选择是通过jquery动态更新的

  • 问题:在构建阶段,我使用一个shell执行器来“zip helloworld.zip helloworld.txt”,然后,我“docker build-t myproject/myapp.”,我希望在其中复制helloworld.zip/“,但似乎我创建的zip文件在docker构建上下文中不可用。我没有将helloworld.zip文件保存到正确的位置吗?还是别的什么?我的长期目标是编写一个p

  • 我最近在学习java swing。请别告诉我它已经过时了。我知道.我想创建这样的文件夹选择器,没有额外的东西。