JavaFX WebView概述,很强大,内置了类似Electron的功能

Wesley13
• 阅读 1587

来自 Murali Billa

JavaFX技术人员的主要成员

在此博客中,我们将研究JavaFX如何渲染网页以及负责该网页的组件-即WebView

JavaFX是:

  • 用于创建和交付可在多种设备上运行的桌面应用程序以及富Internet应用程序(RIA)的软件平台。
  • 图形和媒体包集,使开发人员能够设计,创建,测试,调试和部署可在各种平台上一致运行的富客户端应用程序。

JavaFX的主要功能:

JavaFX WebView概述,很强大,内置了类似Electron的功能

WebView:一个Web组件,使用WebKit HTML技术可以将网页嵌入JavaFX应用程序中。在WebView中运行的JavaScript可以调用Java API,而Java API可以调用在WebView中运行的JavaScript。JavaFX中已添加了对其他HTML5功能的支持,包括Web套接字,Web Worker和Web字体,以及打印功能。

JavaFX WebView:

  • JavaFX WebView  是一个微型浏览器(也称为嵌入式浏览器),它通过JavaFX  应用程序中的API提供Web查看器和完整的浏览功能  。
  • 该浏览器基于  WebKit,这是一个开源Web浏览器引擎,支持HTML5,JavaScript,CSS,DOM渲染和SVG图形。
  • WebView类是Node类的扩展。
  • 嵌入式浏览器继承了Node类的所有字段和方法,因此具有其所有功能。
  • 它封装了一个WebEngine对象,将HTML内容合并到应用程序的场景中,并提供了应用效果和转换的属性和方法。
  • 在WebView对象上调用的getEngine()方法将返回与其关联的Web引擎。
  • 构成嵌入式浏览器的类位于javafx.scene.web包中。
  • WebView   使开发人员可以在其Java应用程序中实现以下功能:
    • 从本地或远程URL呈现HTML内容
    • 支持历史记录并提供前进和后退导航
    • 重新加载内容
    • 将效果应用于Web组件
    • 编辑HTML内容
    • 执行JavaScript命令
    • 从JavaScript执行向上调用到JavaFX
    • 处理事件
  •  除了支持CSS3和ecmascript6(ES6),WebView组件还支持以下HTML5功能:
    • DOM3
    • 帆布
    • 媒体播放
    • 表单控件(<input type =“ color”>除外)
    • 可编辑的内容
    • 历史维护
    • 支持
      标签
    • SVG
    • 网络插座
    • 网络工作者
    • 支持以本国语言编写的域名

下图描述了嵌入式浏览器的体系结构及其与其他JavaFX类的关系:

JavaFX WebView概述,很强大,内置了类似Electron的功能

网络引擎:

  1. 是一种非可视对象,能够一次管理一个网页
  2. 通过其API提供基本的网页功能。
  3. 它支持用户交互,例如导航链接和提交HTML表单,尽管它不直接与用户交互。
  4. 它加载网页,创建其文档模型,根据需要应用样式并在页面上运行JavaScript。
  5. 它提供对当前页面的文档模型的访问,并实现Java应用程序和页面的JavaScript代码之间的双向通信。
  6. 它包装一个WebPage对象,该对象提供与本机Webkit核心的交互。

WebView和WebEngine类之间的关系:

JavaFX WebView概述,很强大,内置了类似Electron的功能

用于在JavaFX WebView中加载内容的代码段:

  1. 创建WebView,WebEngine对象并通过远程URL加载:

JavaFX WebView概述,很强大,内置了类似Electron的功能

2.加载静态HTML内容:

JavaFX WebView概述,很强大,内置了类似Electron的功能

3.从本地文件加载HTML内容:

JavaFX WebView概述,很强大,内置了类似Electron的功能

**4. ** 要在LoadWorker的帮助下跟踪加载进度:

  • 加载始终发生在后台线程上。计划后台作业后,立即返回启动加载的方法。
  • 要跟踪进度和/或取消作业,我们可以使用getLoadWorker()  方法中 可用的  Worker实例  。
  • 以下示例在成功完成加载时更改阶段标题:

JavaFX WebView概述,很强大,内置了类似Electron的功能

5.  访问文档模型

  • WebEngine对象为其网页创建和管理文档对象模型(DOM)。可以使用Java DOM Core类访问和修改模型。
  • getDocument()方法提供对模型根目录的访问。此外,还支持DOM事件规范,以Java代码定义事件处理程序。
  • 以下示例将Java事件侦听器附加到网页的元素。单击该元素将导致应用程序退出:

JavaFX WebView概述,很强大,内置了类似Electron的功能

6.  从JavaFX调用Javascript

  • WebView加载网站后,可以使用executeScript(java.lang.String)方法在当前页面的上下文中执行任意JavaScript代码。

JavaFX WebView概述,很强大,内置了类似Electron的功能

**7.将 **  JavaScript值映射到Java对象:

  • JavaScript值使用显而易见的Java类表示:null变为Java null;布尔值变为java.lang.Boolean; 字符串变成java.lang.String。
  • 如果结果是JavaScript对象,则将其包装为JSObject类的实例。
  • JSObject类是一个代理,可提供对其基础JavaScript对象的方法和属性的访问。
  • 最常用的JSObject方法是getMember(读取命名属性),setMember(设置或定义属性)和call(调用函数值属性)。
  • DOM节点映射到既扩展JSObject又实现适当的DOM接口的对象。要获取Node的JSObject对象,只需执行强制转换:

JSObject jdoc =(JSObject)webEngine.getDocument();

8.将Java对象映射到JavaScript值:

  • JSObject方法setMember和call的参数将Java对象传递给JavaScript环境。
  • 这大致与上述JavaScript到Java的映射相反:Java String,Number或Boolean对象被转换为显而易见的JavaScript值。
  • JSObject对象将转换为原始包装的JavaScript对象。否则,将创建一个JavaRuntimeObject。
  • 这是一个JavaScript对象,充当Java对象的代理,因为访问JavaRuntimeObject的属性将导致访问具有相同名称的Java字段或方法。

JDK中的Webkit升级:

  1. WebView Webkit引擎基于Apple Safari端口(https://trac.webkit.org/)。iOS,GTK,WinCairo,EFL等也使用此端口。
  2. 我们遵循Webkit GTK的发布周期,并将在6个月内对Webkit进行一次升级(https://trac.webkit.org/wiki/WebKitGTK/StableRelease
  3. 升级Webkit的目的是使安全漏洞修补程序除具有新功能之外并遵循最新标准。

接下来的几篇博客将介绍JavaFX WebView架构和Webkit引擎的内部细节。

参考文献:

  1. https://docs.oracle.com/javase/8/javafx/api/javafx/scene/web/WebEngine.html
  2. https://o7planning.org/zh/11151/javafx-webview-and-webengine-tutorial
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1星期前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这