2017-01-05 10 views
1

既存のHTML要素がHの下でここに与えられている:デスクトップアプリケーションのHTML/Javascript DOM要素を操作するためのJava API?

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サポートは素晴らしいでしょう)。私はJavaでいくつかのJavaScriptを制御するためのJavaFXのWebViewを使用するプロジェクトjavafx-d3については

A.:私はこれまでに見つかった何


。 JavaとJavaScriptとの間の通信は、netscape.javascript.JSObjectに基づいており、原則的には正常に動作している:私はのorg.w3c.dom.ElementにJavaScriptの世界から得たのJSObjectをキャストすることができる午前

...と使用DOMを操作するためのJavaメソッド

「もっと深く」、たとえばHTMLCanvasElementを制御するには、JSObjectに基づいて独自のラッパーを作成する必要があります。それは可能ですが、ホイールを再発明するように感じます。


B. GoogleのGWTは、例えば、いくつかのラッパークラスを提供しているようですHTMLCanvasElement

ため

com.google.gwt.dom.client.CanvasElement私はGWTのラッパークラス(com.google.gwt.core.client.JavaScriptObjectから開始)にnetscape.javascript.JSObjectのを変換するために管理していませんでしたが。

これがまったく可能であれば、誰かが例を挙げることができますか?

誰かがそのダミーの例を以下のように実行する方法を知っていますか? GWTの元素について

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(); 

    } 

} 

Mavenの依存関係:

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

それとも、(つまり、JSObjectの階層の上に構築され)DOM操作のための代替/高度なJAVAのAPIを知っていますか?

答えて

1

私はコメントで言及したElementalをJavaFxに移植しようとした人です。アニメーションコンパニオンと呼ばれる小さなアプリケーションを作成しました。 JavaFxで提供されているWebKitエンジンには、多くの機能がありません.JavaからJavaScriptへと多くのデータを移動するのは非常に遅いです。 JavaFxの人々はWebKitを書き換えてJavaFxのレンダリングに依存していますが、UIをあまりにも激しく押すと、リソースがクラッシュしたりリソースが使い果たされたりすることがあります。また、エレメンタル自体は、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に公開しました。そこから、次のようなWebページを開くことができます:

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を実行すると、アプリケーションを実行するメインVMとしてJavaScriptが実行され、Javaの処理が必要な場合は必要に応じてJavaが呼び出されます。 GWTを使ってJavaコードからJavaScriptを生成することさえできます。

+0

詳細な回答ありがとうございます。あなたのjarファイルを使って、gwt要素apiを使ってDOMを制御できるJavaFxアプリケーションを実行しました。 win.alert( "Hello World");私はドキュメントの高さを取得することができます。 window.newAudioContext()は機能しません...あなたが言及した制限のためかもしれません。 – Stefan

+0

プロジェクトjava-fxのWebViewのパフォーマンスに関する問題がいくつか見つかりました。そのトピックに関する詳細はhttp:// stackoverflowを参照してください。com/questions/10762979/performance-of-webview-in-javafx – Stefan

+0

WebViewの代わりに商用のJxBrowserを使用することも可能です。たぶんそこには他の選択肢があるかもしれません。 – Stefan

0

はい、既に見つかったものに非常に近いものがあります。これはGWT要素と呼ばれます。それはGWTですが、実際にはDOM上に直接存在し、非常に完全で実際にはDOM上の薄い氷が本当に好きです。私はhttps://github.com/nielsbaloe/vertxuiに100%Java 100%非同期フレームワークVertxUIを書くためにそれを使用しています。

+0

あなたはGWTの要素について多くの経験をしているようです。上記で追加したJavaFxアプリケーションの例を完成させて、JavaFxシーンのGWT要素コンテンツを表示する方法がありますか?私が使用できるブラウザコンストラクタはありますか? – Stefan

+0

GWTの要素をJavaFxに移植したプロジェクトが見つかりました。まだ試してみませんでした:https://github.com/my2iu/gwt – Stefan

+0

私はGWTの要素を実際に経験していません。私はドキュメント、コンソール、ウィンドウのみを使用しています。言い換えれば、ブラウザのjavascriptで使用できるプリミティブです。私は残りを知りません。私はJavaFXの経験がありません。上のリンクを見て幸運! – Niels

関連する問題