2012-11-20 15 views
5

JavaFX(2.2)WebViewを使用する場合、Javaコード内のURLをリッスンして処理する方法はありますか?JavaFX 2 WebView URLリスナー

例:webEngine.loadContent(html)を使用してWebViewにローカルHTMLファイルをロードしています。 HTMLには、

<script src="local:my-script.js"></script> 
<img src="cms:1234.png"/> 

などのリソースも含まれています。これはローカルファイルでもあり、Javaアプリケーションから提供する必要があります。だから私はページからのリクエストを処理できるリスナーを登録したい。

編集:HTMLページ内に読み込まれるリソースデータは、コンテンツ管理システムから取得されるため、相対パスを使用しても機能しません。

+0

私は考えている簡単な方法があります:すべてのRessourcesをHTMLファイルに関連させ、そのファイルをファイルごとにロードします:///folder/file.html –

答えて

5

独自のURLプロトコルハンドラを作成し、使用してインストールします。

URL.setURLStreamHandlerFactory(new HandlerFactory()); 

A New Era for Java URL Protocol Handlers articleは、ハンドラを作成するための詳細な手順を提供します。

WebViewはカスタムプロトコルを使用してコンテンツを読み込むことができます。

+0

ありがとう、ちょうど私が探していたもの。 – chrise

1

最も簡単な方法は、ロードする前にlocal:リソースをhtmlの代わりに実行時の値に置き換えることです。例えば:

public class WebViewLocal extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     String st = "<html><head><title>X</title>" 
       + "</head><body><img src='local:1.jpg'/>" 
       + "</body></html>"; 
     System.out.println(st); 
     primaryStage.setScene(new Scene(loadHtml(st), 400, 400)); 
     primaryStage.show(); 
    } 

    public WebView loadHtml(String html) { 
     html = html.replace("local:", getClass().getResource(".").toString()); 
     WebView view = new WebView(); 
     view.getEngine().loadContent(html); 
     return view; 
    } 

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

N.B:これで作業サンプルは、ちょうどこのファイルと同じ場所で1.jpg画像を置きます。

実際に JavaクラスからJavaクラスを操作したい場合は、「JavaFX to JavaScript bridge」機能を使用できます。ここでは、チュートリアルを見てみましょう:https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

+0

ありがとうございます。しかし、私はこれがうまくいかないと思う。 のような画像。任意のテキスト値(スクリプト、CSS、...)で動作する可能性があります。 – chrise

+0

この場合、このアンサーは役に立ちません。loadContent()はコンテンツ(ブラウザの場所)のみを読み込みますが、依存するリソースの読み込みに関する質問です。 –

+0

@chrise:画像を含むURLを使用するすべてのリソースで動作します。 –

0

ローカルであなたのhtmlファイルを読み込む場合は、単純に相対パスを使用することができます。

これは相対的なスクリプトで、HTMLをロードする例です。 http://code.google.com/p/jfx-gap/source/browse/src/main/java/com/googlecode/jfxgap/JFXGap.java

トリックはhtml内の相対パスである必要があります。

+0

はい、これはローカルファイルで動作します。私は、データがコンテンツ管理システムから来ているということを忘れていたので、より多くのビジネスロジックが必要になりました。私が持っていた1つのアイデアは、データを提供し、HTML内のすべてのパスを書き換えるために小さなhttpサーバを走らせていたが、それに対してよりスマートな解決策があるかもしれない。 – chrise