用于在桌面应用程序中操作html / Javascript DOM元素的Java API?

时间:2017-01-05 14:58:12

标签: javascript java api dom gwt

现有的HTML元素在H:

下给出

https://developer.mozilla.org/de/docs/Web/API

此处显示了可用的JAVA API类:

https://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/Element.html

不幸的是,org.w3c.dom软件包错过了一些更具体的元素,如 HTMLCanvasElement

正在寻找一些至少支持HTMLCanvasElements的更高级的Java API (完整的WEP API支持会很棒)。

到目前为止我发现了:

一个。对于Project javafx-d3,我使用JavaFx WebView来控制Java中的一些JavaScript。 Java和JavaScript之间的通信基于 netscape.javascript.JSObject ,原则上工作正常:

我能够将我从JavaScript世界获得的JSObject转换为org.w3c.dom.Element ...并使用其Java方法来操作DOM。

如果我想“更深入”,例如控制HTMLCanvasElement,我必须编写基于JSObject的自己的包装器。这是可能的,但感觉就像重新发明轮子。

B中。 Google GWT 似乎提供了一些包装类,例如

com.google.gwt.dom.client.CanvasElement

HTMLCanvasElement

但是我没有设法将netscape.javascript.JSObject转换为GWT包装类(从 com.google.gwt.core.client.JavaScriptObject 开始)。

如果可以的话,有人可以提供一个例子吗?

有人知道如何在下面运行这个虚拟示例吗?

package main;

import elemental.client.Browser;
import elemental.html.AudioContext;
import elemental.html.AudioParam;
import elemental.html.Oscillator;
import elemental.html.Window;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class GwtElementDemo extends Application {

    private Scene scene;

    private Region browser;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {

        //set state title
        stage.setTitle("JavaFx demo");  


        browser = new Region();

         Window window = Browser.getWindow();
            AudioContext audioContext = window.newAudioContext();
            Oscillator osc = audioContext.createOscillator();
            osc.setType(Oscillator.SQUARE);
            osc.connect((AudioParam) audioContext.getDestination(), 0);
            osc.getFrequency().setValue(440.0f);
            osc.noteOn(0);

        //create the scene
        scene = new Scene(browser, 750, 500, Color.web("#666970"));
        stage.setScene(scene);
        stage.show();

    }   

}

GWT元素的maven依赖:

<dependency>
         <groupId>com.google.gwt</groupId>
         <artifactId>gwt-elemental</artifactId>
          <version>2.8.0</version>
</dependency>

或者您是否知道用于DOM操作的替代/高级JAVA API(在JSObject层次结构上构建)?

2 个答案:

答案 0 :(得分:2)

我是那个试图将Elemental移植到JavaFx的人,你在评论中提到过。我用它制作了一个名为Animation Companion的小应用程序,它并不是那么好。随JavaFx提供的WebKit引擎缺少许多功能,将大量数据从Java迁移到JavaScript并返回它的速度非常慢。 JavaFx人员重写了WebKit以依赖JavaFx进行渲染,有时会出现一些不匹配的情况,如果你过于用力推动UI,会导致事情崩溃或耗尽资源。此外,Elemental本身有点过时,有很多特定于WebKit的功能,缺少功能和其他错误。

来自我的github的测试JavaFx代码要求您首先构建元素。我不完全记得怎么做。我想你只是进入元素目录并在那里运行ant,然后你可以在某处链接测试的gwt-elemental.jar文件输出。我暂时在http://www.user00.com/gwt-elemental.jar放置了预建版本。您还需要来自GWT 2.7的gwt-user.jar的一些文件。我暂时在http://www.user00.com/gwt-user-pruned.jar处提供了这些文件。从那里,您可以使用以下内容开始一个网页:

Stage stage = ...

// Create the WebView
BorderPane border = new BorderPane();
WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
border.setCenter(webView);

Scene scene = new Scene(border);
stage.setScene(scene);
stage.show();

// Redirect the alert handler to send output to stderr
engine.setOnAlert(new EventHandler<WebEvent<String>>() {
   @Override
   public void handle(WebEvent<String> msg) {
      System.err.println(msg.getData());
   }});

// Start up the Gwt module when the page has finished loading. Grab the window
// and document objects and stash them somewhere for use later.
engine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<Worker.State>() {
         @Override
         public void changed(ObservableValue<? extends State> ov,
               State oldState, State newState) {
            if (newState == Worker.State.SUCCEEDED) {
               Window win = (Window)GwtFxBridge.wrapJs(engine.executeScript("window"));

               // The web page is loaded, and you have the global window
               // JS object, so you can start your UI now
             }
         }
      });

// Load the main Gwt application web page
try {
   engine.load(new File("ui/index.html").toURI().toURL().toExternalForm());
} 
catch(MalformedURLException e)
{
   throw new IllegalArgumentException("Misconfiguration error. Cannot find empty web page", e);
}

我真的不建议沿着这条路走下去。它没有足够的支持,你必须知道你的JavaScript和你的Java,以便调试你将面临的问题。我认为颠倒事物更有意义。运行nw.js以运行JavaScript作为驱动应用程序的主VM,然后在需要执行Java操作时根据需要调用Java。您甚至可以使用GWT从Java代码生成JavaScript。

答案 1 :(得分:0)

是的,有一个,非常接近你已经找到的。它被称为GWT元素。虽然它是GWT,它实际上直接在DOM上,非常完整,真的非常喜欢直接在DOM上的薄冰。我正在使用它在https://github.com/nielsbaloe/vertxui编写100%java 100%异步框架VertxUI。