javaFX实例1-webView实现简单浏览器

webView:

是一个管理webEngine和显示它中间内容的节点。这个对象只能从fx的线程中创建。

webEngine:

是一个管理网页的不可见控件,它可以加载网页,创建文档模型,运行javascript,加载必要的样式,很重要的是它提供的网页的文档模型很不错,另外,它还可以实现java应用程序和javascript的双向通信。

1.访问页面

1.通过任意的url地址进行访问,基于java.net包来实现,engine.load(String url)即可

2.从in-memory String的方式(内存查找已有网址的字符串) 通过loadContent(java.lang.String)或者loadContent(java.lang.String, java.lang.String)的方式实现。    

 

  • loadContent(java.lang.String URLcontext):直接加载给定的url内容,当你在内存中有一个要访问的url地址时非常快,或者你要加载一些url无法表示的数据时,用这个。

  • loadContent(java.lang.String URLcontext, java.lang.String contentType):和上面的相比,你可以指定要加载的类型,所以可以加载html以外的类型。

2.回调函数

这些回调函数被调用时,使用页面上的脚本运行请求对用户界面进行操作,例如,打开一个弹出窗口,或改变状态的文本。一个webengine对象不能处理这些请求内部,所以它将请求传递给相应的回调。如果没有回调是一个具体的操作定义,该请求被忽略。    

     

  • The table below shows JavaScript user interface methods and properties with their corresponding WebEngine callbacks:

    JavaScript method/propertyWebEngine callback
    window.alert()onAlert
    window.confirm()confirmHandler
    window.open()createPopupHandler
    window.open() and
    window.close()
    onVisibilityChanged
    window.prompt()promptHandler
    Setting window.statusonStatusChanged
    Setting any of the following:
    window.innerWidthwindow.innerHeight,
    window.outerWidthwindow.outerHeight,
    window.screenXwindow.screenY,
    window.screenLeftwindow.screenTop
    onResized

       事例代码:

  • Stage stage;
    webEngine.setOnResized(
            new EventHandler<WebEvent<Rectangle2D>>() {
                public void handle(WebEvent<Rectangle2D> ev) {
                    Rectangle2D r = ev.getData();
                    stage.setWidth(r.getWidth());
                    stage.setHeight(r.getHeight());
                }
            });
     

也就是说,webEngine可以获得javascript的内容,以及用户的响应,实现了java程序和javascript的交互。

3.文档对象入口

也就是支持dom解析

  • EventListener listener = new EventListener() {
        public void handleEvent(Event ev) {
            Platform.exit();
        }
    };
    
    Document doc = webEngine.getDocument();
    Element el = doc.getElementById("exit-app");
    ((EventTarget) el).addEventListener("click", listener, false);
     

4.执行javascript

   

webEngine.executeScript("history.back()");

5.就是java和javascript的交互,可以参考api

 

下面是代码

[java] view plain copy

  1. public class MyWebViewSample extends Application {  
  2.     public static final String defaultURL="http://www.baidu.com";  
  3.     @Override  
  4.     public void start(Stage primaryStage) {  
  5.         init( primaryStage);  
  6.         primaryStage.show();  
  7.     }  
  8.     private void init(Stage primaryStage){  
  9.         final Stage stage=primaryStage;  
  10.         Group group=new Group();//作为根节点,也就是root  
  11.         primaryStage.setScene(new Scene(group));  
  12.           
  13.         WebView webView=new WebView();  
  14.         final WebEngine engine=  webView.getEngine();  
  15.         engine.load(defaultURL);  
  16.           
  17.         final TextField textField=new TextField(defaultURL);  
  18.         /**修改输入栏的地址,也就是访问那个网站,这个地址栏显示那个网站的地址 
  19.          * locationProperty()是获得当前页面的url封装好的ReadOnlyStringProperty对象 
  20.          */  
  21.         engine.locationProperty().addListener(new ChangeListener<String>(){  
  22.             @Override  
  23.             public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {  
  24.                 textField.setText(newValue);  
  25.             }  
  26.         });  
  27.         /** 
  28.          * 设置标题栏为当前访问页面的标题。 
  29.          */  
  30.         engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>(){  
  31.             @Override  
  32.             public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {  
  33.                 if(newValue==Worker.State.SUCCEEDED){  
  34.                     stage.setTitle(engine.getTitle());  
  35.                 }  
  36.             }  
  37.         });  
  38.           
  39.           
  40.        /** 
  41.         * 测试能否获得javascript上面的交互内容。 
  42.         * 可以自己写一个包含window.alert("neirong")的html进行测试。 
  43.         * 返回的是neirong 
  44.         */  
  45.         engine.setOnAlert(new EventHandler<WebEvent<String>>() {  
  46.   
  47.             @Override  
  48.             public void handle(WebEvent<String> event) {  
  49.                 System.out.println("this is event"+event);  
  50.             }  
  51.         });  
  52.   
  53.         //加载新的地址  
  54.         EventHandler<ActionEvent> handler= new EventHandler<ActionEvent>() {  
  55.             @Override  
  56.             public void handle(ActionEvent event) {  
  57.             engine.load(textField.getText().startsWith("http://")?textField.getText().trim():"http://"+textField.getText().trim());  
  58.             }  
  59.         };  
  60.           
  61.         textField.setOnAction(handler);  
  62.           
  63.         Button okButton=new Button("go");  
  64.         okButton.setDefaultButton(true);  
  65.         okButton.setOnAction(handler);  
  66.           
  67.         HBox hbox=new HBox();  
  68.         hbox.getChildren().addAll(textField,okButton);  
  69.         HBox.setHgrow(textField, Priority.ALWAYS);  
  70.           
  71.         VBox vBox=new VBox();  
  72.         vBox.getChildren().addAll(hbox,webView);  
  73.         VBox.setVgrow(webView, Priority.ALWAYS);  
  74.           
  75.         group.getChildren().add(vBox);  
  76.     }  
  77.     /** 
  78.      * 
  79.      * @param args 
  80.      */  
  81.     public static void main(String[] args) {  
  82.         launch(args);  
  83.     }  
  84.       
  85. }  

https://blog.csdn.net/oppo117/article/details/17354453

转载于:https://my.oschina.net/xiaominmin/blog/1829390

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值