簡體   English   中英

用於在桌面應用程序中處理html / Javascript DOM元素的Java API?

[英]Java API for manipulating html/Javascript DOM elements in a desktop application?

現有的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支持會很棒)。


到目前為止,我發現:

答:對於項目javafx-d3,我使用JavaFx WebView來控制Java中的某些JavaScript。 Java和JavaScript之間的通信基於netscape.javascript.JSObject,並且在原理上可以正常工作:

我能夠將來自JavaScript世界的JSObject強制轉換為org.w3c.dom.Element ...,並使用其Java方法來操作DOM。

如果我想“深入”,例如控制HTMLCanvasElement,則必須基於JSObject編寫自己的包裝器。 這是可能的,但感覺就像是在重新發明輪子。


B. Google GWT似乎提供了一些包裝器類,例如

HTMLCanvasElement的 com.google.gwt.dom.client.CanvasElement

但是,我沒有設法將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();

    }   

}

MWT對GWT元素的依賴:

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

還是您知道用於DOM操作的替代/高級JAVA API(它是基於JSObject層次結構構建的)?

我是試圖將Elemental移植到您在注釋中提到的JavaFx的人。 我用它制作了一個名為Animation Companion的小型應用程序,但它並不是那么好。 JavaFx隨附的WebKit引擎缺少許多功能,並且將大量數據從Java移至JavaScript以及移回JavaScript的速度非常慢。 JavaFx人員重寫了WebKit使其依賴JavaFx進行呈現,有時會有些不匹配,如果過分推UI會導致崩潰或資源不足。 而且,Elemental本身也已經過時了,其中包含許多特定於WebKit的功能,缺少的功能以及其他錯誤。

我的github中的測試JavaFx代碼要求您首先構建基本元素。 我不完全記得該怎么做。 我認為您只是進入elemental目錄並在其中運行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。

是的,有一個與您已經找到的非常接近。 它被稱為GWT元素。 盡管它是GWT,但它確實直接在DOM上,令人難以置信地完整,並且真的很像直接在DOM上的薄冰。 我正在使用它在https://github.com/nielsbaloe/vertxui上編寫100%java 100%異步框架VertxUI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM