PopupFeatures 處理新窗口
WebHistory
網頁一般都帶有歷史記錄的功能,可以回退,也可以前進,fx用WebHistory處理。
- final WebHistory wh = webEngine.getHistory(); //獲取webhistory
- go(int offset) //跳到相對應的頁,一般-1是后退,1是前進
- getCurrentIndex() //獲取當前頁索引,開始頁索引為0,點擊進入下一頁此時為1。
WebView WebEngin
WebView作為一個node用於顯示網頁內容
- WebView webView = new WebView();
WebEngine用於對網頁的操作,通過webView獲取web引擎
- WebEngine webEngine = webView.getEngine();
WebEngine的一些方法
- webEngine.load(java.lang.String url); //加載一個網頁
- webEngine.executeScript(java.lang.String script) //執行網頁中的腳本語言
看個demo
- public void init(Group root){
- VBox box = new VBox();
- WebView webView = new WebView();
- final WebEngine webEngine = webView.getEngine();
- webEngine.load("http://forums.oracle.com/forums/");
- box.getChildren().add(webView);
- Button button = new Button("showAll");
- button.setOnAction(new EventHandler<ActionEvent>() {
- @Override
- public void handle(ActionEvent arg0) {
- webEngine.executeScript("showAll()");
- }
- });
- box.getChildren().add(button);
- root.getChildren().add(box);
- }
這里要注意的是,腳本必須是你網頁中存在的。
可以在Application中執行網頁中的腳本,那么也可以在網頁腳本中執行Application方法
- JSObject win = (JSObject) webEngine.executeScript("window"); 獲取js對象
- win.setMember("app", new JavaApp()); 然后把應用程序對象設置成為js對象
- private class JavaApp {
- public void exit() {
- Platform.exit();
- }
- public void login(){
- System.out.println("login...");
- }
- }
此時在頁面可以調用
- <a href="about:blank" onclick="app.exit()">Exit the Application</a>
在網頁上右鍵點擊的時候,可以選擇在新窗口打開,此時你必須自己設定。
- setCreatePopupHandler(Callback<PopupFeatures,WebEngine> handler) //處理彈出窗口。
- webEngine.setCreatePopupHandler(
- new Callback<PopupFeatures, WebEngine>() {
- @Override public WebEngine call(PopupFeatures config) {
- return newWebView.getEngine();
- }
- }
- );
網頁是通過WebView顯示的,所以當你需要一個新窗口時,你必須弄一個新的webView,並為該webview設置好顯示的位置,然后在上面的代碼中獲取該webview的webengine返回。
發現加載web頁面需要一段時期,此時application的一些節點顯示出來了,若是想讓節點顯示和web一起顯示,則可以監聽webEngine的狀態屬性。
- webEngine.getLoadWorker().stateProperty().addListener(
- new ChangeListener<State>() {
- @Override
- public void changed(ObservableValue<? extends State> ov,
- State oldState, State newState) {
- if (newState == State.SUCCEEDED) {
- //添加節點,或者把app注入到網頁腳本當中
- }
- }
- }
- );
看個demo:
- public void init(Group root){
- final TabPane tp = new TabPane();
- WebView webView = new WebView();
- System.out.println(root.getScene());
- webView.prefWidthProperty().bind(root.getScene().widthProperty());
- webView.prefHeightProperty().bind(root.getScene().heightProperty());
- final WebEngine webEngine = webView.getEngine();
- webEngine.load("http://forums.oracle.com/forums/");
- webEngine.setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {
- @Override
- public WebEngine call(PopupFeatures arg0) {
- WebView newWebView = new WebView();
- WebEngine newWebEngine = newWebView.getEngine();
- Tab tab = new Tab("new Window");
- tab.textProperty().bind(newWebEngine.titleProperty());
- tab.setContent(newWebView);
- tp.getTabs().add(tab);
- return newWebEngine;
- }
- });
- final Tab tab = new Tab();
- tab.textProperty().bind(webEngine.titleProperty());
- tab.setContent(webView);
- // process page loading
- webEngine.getLoadWorker().stateProperty().addListener(
- new ChangeListener<State>() {
- @Override
- public void changed(ObservableValue<? extends State> ov,
- State oldState, State newState) {
- if (newState == State.SUCCEEDED) {
- tp.getTabs().add(tab);
- }
- }
- }
- );
- root.getChildren().add(tp);
- }
原文:http://lujin55.iteye.com/blog/1747187
官方文檔:http://docs.oracle.com/javafx/2/api/index.html

