Wing的小站

  • 首页
  • IT新闻
  • 技术文章
  • 生活随笔
  • 休闲娱乐
  • 个人作品
  • 留言板
  • 关于博主
JavaFX,Unity3D,Android,IOS,技术教程,生活随笔
  1. 首页
  2. 技术文章
  3. 正文

JavaFX WebView调用系统浏览器打开网页

2015年6月9日 15107点热度 0人点赞 11条评论

目前人有点懒散了,所以之前的《从零开始学习JavaFX》也好久没更新了。因为有访问这个博客的朋友发邮件问问题,就准备顺带着写一下。

这个朋友的需求是用WebView嵌入网页,然后在点击网页内部的链接时,使用外部浏览器来打开网页。

其实我之前也提到过很多次,JavaFX最重要的技术要点是属性绑定机制,几乎在国外网站或者Java官方开发程序中,属性绑定也必用的优秀机制。任何涉及到属性的事件等都可以从这方面下手。

同样的,我们如何通过点击WebView链接调用系统浏览器也可以从这方面下手。

仔细观察,可以发现在JavaFX的WebView的WebEngine中有location属性,根据官方说明,代表的是当前Web页面的URL。

这样一来,我们通过监听location属性的改变,然后调用系统浏览器打开改变后的链接即可。

代码如下:

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebView;


public class Main extends Application {
	private String mInitUrl = "https://www.baidu.com";
	@Override
	public void start(Stage primaryStage) {
		try {
			AnchorPane root = new AnchorPane();
			Scene scene = new Scene(root,400,400);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			WebView mWebView = new WebView();
			ScrollPane scrollPane = new ScrollPane(mWebView);
			scrollPane.setPrefSize(scene.getWidth(), scene.getHeight());
			root.getChildren().add(scrollPane);
			mWebView.autosize();
			mWebView.getEngine().load(mInitUrl);
			
			mWebView.getEngine().locationProperty().addListener(new ChangeListener() {
			    @Override
			    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
			    {
			        Desktop d = Desktop.getDesktop();
			        URI address;
					try {
					   if(!observable.getValue().contentEquals(mInitUrl)){
						address = new URI(observable.getValue());
				        d.browse(address);
					   }
					} catch (URISyntaxException | IOException e) {
						e.printStackTrace();
					}
			    }
			});
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

其实对于目前的JavaFX来说,熟悉和使用属性绑定机制,是对JavaFX进阶开发的一个很大的帮助,大家可以多试试。

但是对于上面的实现方式来说,WebView里面的页面也同样的改变了,通常我们使用的时候,希望点击WebView使用默认浏览器跳转,而原页面不变,例如帮助文档等内容。

这里我们可以使用一个开源项目LibFX,里面提供了监听JavaFX的WebView链接的工具类。

代码如下:

WebViews.addHyperlinkListener(mWebView, new WebViewHyperlinkListener() {
				
				@Override
				public boolean hyperlinkUpdate(HyperlinkEvent event) {
					System.out.println(event.getURL());
					Desktop d = Desktop.getDesktop();
					try {
				        d.browse(event.getURL().toURI());
					} catch (URISyntaxException | IOException e) {
						e.printStackTrace();
					}
					return true;
				}
			},EventType.ACTIVATED);

这样一来就能够点击WebView内部链接,使用浏览器打开,并且原WebView页面不变了。

标签: javafx WebView
最后更新:2017年4月14日

wing1314

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

  • 匿名

    :wink:

    2021年12月10日
    回复
  • 匿名

    :redface: :redface: :redface: :redface: :redface: :redface: :redface: :surprised: :eek:

    2021年10月29日
    回复
  • 匿名

    :confused: :mad:

    2021年5月28日
    回复
  • 匿名

    :eek: :eek: :eek: :confused: :confused: :cool:

    2020年8月18日
    回复
  • 匿名

    :arrow: :twisted: :mad: :mad: :mad: :mad: :twisted: :twisted: :mad: :mad: :mad: :mad: :mad: :mad: :lol: :lol: :lol: :confused: :eek: :surprised: :razz: :razz: :razz: :razz: :razz: :evil: :evil: :evil: :exclaim: :exclaim: :exclaim: :smile: :smile: :smile: :redface: :redface: :redface: :redface: :redface: :redface: :biggrin: :biggrin: :biggrin: :surprised: :surprised:

    2020年5月11日
    回复
  • 匿名

    :smile: :smile:

    2019年2月12日
    回复
  • 匿名

    :drooling:

    2018年6月13日
    回复
  • 匿名

    :razz:

    2018年6月12日
    回复
  • 匿名

    :cool: :cool: :arrow: :arrow: :cool: :wink: :cool: :persevering: :mad: :shit: :shit:

    2018年6月12日
    回复
  • 匿名

    :rolleyes: :twisted:

    2018年6月12日
    回复
  • 匿名

    :exclaim: :shit: :persevering: :wink:

    2018年6月12日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    COPYRIGHT © 2023 Wing的小站. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    鄂ICP备17006951号-1

    42011102000591