首页 > 代码库 > JavaFX学习之Web

JavaFX学习之Web

   PopupFeatures 处理新窗口 
   WebHistory 
网页一般都带有历史记录的功能,可以回退,也可以前进,fx用WebHistory处理。 

Java代码  收藏代码
  1. final WebHistory wh = webEngine.getHistory();   //获取webhistory  
  2. go(int offset)   //跳到相对应的页,一般-1是后退,1是前进  
  3. getCurrentIndex()  //获取当前页索引,开始页索引为0,点击进入下一页此时为1。  


   WebView WebEngin 
WebView作为一个node用于显示网页内容 

Java代码  收藏代码
  1. WebView webView = new WebView();  


WebEngine用于对网页的操作,通过webView获取web引擎 

Java代码  收藏代码
  1. WebEngine webEngine = webView.getEngine();  

WebEngine的一些方法 

Java代码  收藏代码
  1. webEngine.load(java.lang.String url);  //加载一个网页  
  2. webEngine.executeScript(java.lang.String script)  //执行网页中的脚本语言  


看个demo 

Java代码  收藏代码
  1. public void init(Group root){  
  2.     VBox box = new VBox();  
  3.     WebView webView = new WebView();  
  4.     final WebEngine webEngine = webView.getEngine();  
  5.     webEngine.load("http://forums.oracle.com/forums/");  
  6.     box.getChildren().add(webView);  
  7.     Button button = new Button("showAll");  
  8.     button.setOnAction(new EventHandler<ActionEvent>() {  
  9.           
  10.         @Override  
  11.         public void handle(ActionEvent arg0) {  
  12.             webEngine.executeScript("showAll()");  
  13.         }  
  14.     });  
  15.     box.getChildren().add(button);  
  16.     root.getChildren().add(box);  
  17. }  


这里要注意的是,脚本必须是你网页中存在的。 

可以在Application中执行网页中的脚本,那么也可以在网页脚本中执行Application方法 

Java代码  收藏代码
  1. JSObject win = (JSObject) webEngine.executeScript("window");  获取js对象  
  2. win.setMember("app", new JavaApp()); 然后把应用程序对象设置成为js对象  
  3. private class JavaApp {  
  4.     public void exit() {  
  5.         Platform.exit();  
  6.     }  
  7.     public void login(){  
  8.         System.out.println("login...");  
  9.     }  
  10. }  


此时在页面可以调用 

Java代码  收藏代码
  1. <a href=http://www.mamicode.com/"about:blank" onclick="app.exit()">Exit the Application</a>  



在网页上右键点击的时候,可以选择在新窗口打开,此时你必须自己设定。 

Java代码  收藏代码
  1. setCreatePopupHandler(Callback<PopupFeatures,WebEngine> handler)  //处理弹出窗口。  
  2.  webEngine.setCreatePopupHandler(  
  3.             new Callback<PopupFeatures, WebEngine>() {  
  4.                 @Override public WebEngine call(PopupFeatures config) {  
  5.                     return newWebView.getEngine();  
  6.                 }  
  7.              }  
  8.  );  


网页是通过WebView显示的,所以当你需要一个新窗口时,你必须弄一个新的webView,并为该webview设置好显示的位置,然后在上面的代码中获取该webview的webengine返回。 

发现加载web页面需要一段时期,此时application的一些节点显示出来了,若是想让节点显示和web一起显示,则可以监听webEngine的状态属性。 

Java代码  收藏代码
  1. webEngine.getLoadWorker().stateProperty().addListener(  
  2.             new ChangeListener<State>() {  
  3.                 @Override  
  4.                 public void changed(ObservableValue<? extends State> ov,  
  5.                     State oldState, State newState) {  
  6.                     if (newState == State.SUCCEEDED) {  
  7.                          //添加节点,或者把app注入到网页脚本当中  
  8.                         }  
  9.                     }  
  10.                 }  
  11.         );  


看个demo: 

Java代码  收藏代码
  1. public void init(Group root){  
  2.     final TabPane tp = new TabPane();  
  3.     WebView webView = new WebView();  
  4.     System.out.println(root.getScene());  
  5.     webView.prefWidthProperty().bind(root.getScene().widthProperty());  
  6.     webView.prefHeightProperty().bind(root.getScene().heightProperty());  
  7.     final WebEngine webEngine = webView.getEngine();  
  8.     webEngine.load("http://forums.oracle.com/forums/");  
  9.     webEngine.setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {  
  10.           
  11.         @Override  
  12.         public WebEngine call(PopupFeatures arg0) {  
  13.             WebView newWebView = new WebView();  
  14.             WebEngine newWebEngine = newWebView.getEngine();  
  15.             Tab tab = new Tab("new Window");  
  16.             tab.textProperty().bind(newWebEngine.titleProperty());  
  17.             tab.setContent(newWebView);  
  18.             tp.getTabs().add(tab);  
  19.             return newWebEngine;  
  20.         }  
  21.     });  
  22.     final Tab tab = new Tab();  
  23.     tab.textProperty().bind(webEngine.titleProperty());  
  24.     tab.setContent(webView);  
  25.        // process page loading  
  26.        webEngine.getLoadWorker().stateProperty().addListener(  
  27.            new ChangeListener<State>() {  
  28.                @Override  
  29.                public void changed(ObservableValue<? extends State> ov,  
  30.                    State oldState, State newState) {  
  31.                    if (newState == State.SUCCEEDED) {  
  32.                     tp.getTabs().add(tab);  
  33.                        }  
  34.                    }  
  35.                }  
  36.        );  
  37.     root.getChildren().add(tp);  
  38. }  

   原文:http://lujin55.iteye.com/blog/1747187

官方文档:http://docs.oracle.com/javafx/2/api/index.html