2012-11-20 94 views
5

使用JavaFX(2.2)WebView時,有沒有一種方法可以在Java代碼中偵聽和處理url?JavaFX 2 WebView URL偵聽器

例如:我正在用webEngine.loadContent(html)將本地HTML文件加載到WebView中。該HTML包含資源如

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

這也是一個本地文件,應該從Java應用程序提供。所以我想註冊一個可以處理頁面請求的監聽器。

編輯:在HTML頁面中加載的資源數據來自content-managemant-system,因此使用相對路徑不起作用。

+0

我覺得有一個簡單的方法:使所有的Ressources相對於你的HTML文件,並通過file:///folder/file.html –

回答

5

創建自己的URL協議處理器,並使用安裝:

URL.setURLStreamHandlerFactory(new HandlerFactory()); 

A New Era for Java URL Protocol Handlers article提供用於創建處理程序的詳細說明。

WebView可以使用您的自定義協議來加載您的內容。

+0

謝謝,正是我一直在尋找的。 – chrise

1

在加載之前,最簡單的方法是用HTML中的運行時值替換local:資源。例如: -

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圖像在同一個地方,因爲這文件。

如果你真的想要從JavaScript的JavaScript類工作,你可以使用「JavaFX to JavaScript橋」功能。看看教程這裏: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

是的,這將與本地文件一起使用。我忘記提及數據來自內容管理系統,因此需要更多業務邏輯。我的一個想法是,運行一個小型的http服務器來提供數據並重寫HTML中的所有路徑,但也許有一個更聰明的解決方案。 – chrise