当前位置: 首页 > news >正文

javafx之webEngine超详细解析

JavaFX WebEngine

JavaFX教程 - JavaFX WebEngine

JavaFX 提供与 HTML5 内容互操作的功能。

JavaFX 中的底层网页渲染引擎是名为 WebKit 的流行的开源API。此 API 用于 Apple 的 Safari 浏览器,Amazon 的 Kindle 设备,并在 Google 的 Chrome 浏览器中使用。

嵌入式浏览器使您能够在 JavaFX 应用程序中执行以下任务:

  • 从本地或远程 URL 呈现 HTML
  • 获取网络历史记录
  • 执行 JavaScript命令
  • JavaScript 调用 JavaFX
  • 管理网络弹出窗口

WebEngine

JavaFX 提供了一个能够加载 HTML5 内容的非 GUI 组件,称为 WebEngine API(javafx.scene.web.WebEngine)。

这个 API 基本上是一个 WebEngine类的对象实例,用于加载包含 HTML5 内容的文件。

要加载的 HTML5 文件可以位于本地文件系统,Web 服务器或 JAR 文件中。

使用 Web 引擎对象加载文件时,将使用后台线程来加载 Web 内容,以便它不会阻止 JavaFX 应用程序线程。

从网址载入

我们可以通过使用 WebEngineload()方法从 URL加载 Web 内容。

WebEngine 使用后台线程,坚持基于事件的编程模型。

Web 引擎可以从远程 Web 服务器异步加载 Web 内容,并在内容加载完成时通知处理程序代码。

以下代码从后台工作线程中的远程 Web 服务器加载 HTML 内容。

要监视或确定工作线程是否已完成 javafx.beans.value.ChangeListener添加到 state 属性。

import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;

public class Main extends Application {
  public static void main(String[] args) {
    Application.launch(args);
    
  }

  @Override
  public void start(Stage primaryStage) {
    WebEngine webEngine = new WebEngine();
    webEngine.getLoadWorker().stateProperty()
        .addListener((obs, oldValue, newValue) -> {
          if (newValue == State.SUCCEEDED) {
            System.out.println("finished loading");
          }
        }); // addListener()

    // begin loading...
    webEngine.load("http://www.www.w3cschool.cn");

    
    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

以下是所有可能的工作线程状态:

  • READY
  • SCHEDULED
  • RUNNING
  • SUCCEEDED
  • CANCELLED
  • FAILED

加载HTML字符串

我们可以使用WebEngineloadContent()方法将 HTML 字符串加载到WebEngine

Web 引擎的 loadContent(String htmlText) 方法可以加载表示为字符串的 HTML 内容动态而不必从远程服务器获取内容。

以下代码段加载预先生成的 HTML 内容:

webEngine.loadContent("<html><body><b>JavaFX</b></body></html>");

HTML DOM内容

Web 引擎能够按照基于 W3C 标准的 Java API 来将当前页面的文档对象模型(DOM)加载为 XML 内容。

在 Web 引擎实例成功加载 HTML 内容后,可以通过调用Web引擎的 getDocument() 方法轻松获取 XML DOM。

以下代码获取一个 Document(org.w3c.dom.Document) 实例,假设 Web 引擎完成加载 HTML 或 XML 内容。

import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;

public class Main extends Application {
  public static void main(String[] args) {
    Application.launch(args);
    
  }

  @Override
  public void start(Stage primaryStage) {
    WebEngine webEngine = new WebEngine();
    webEngine.getLoadWorker().stateProperty()
        .addListener((obs, oldValue, newValue) -> {
          if (newValue == State.SUCCEEDED) {
            System.out.println("finished loading");
            org.w3c.dom.Document   xmlDom  = webEngine.getDocument();
            System.out.println(xmlDom);
          }
        }); // addListener()

    // begin loading...
    webEngine.load("http://www.www.w3cschool.cn");

    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

以文本字符串的形式获取原始XML数据

以下代码将 XML DOM 转换为String

import java.io.StringWriter;

import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class Main extends Application {
  public static void main(String[] args) {
    Application.launch(args);

  }

  @Override
  public void start(Stage primaryStage) {
    WebEngine webEngine = new WebEngine();
    webEngine
        .getLoadWorker()
        .stateProperty()
        .addListener(
            (obs, oldValue, newValue) -> {
              System.out.println(newValue);
              if (newValue == State.SUCCEEDED) {
                System.out.println("finished loading");
                try {
                  TransformerFactory transformerFactory = TransformerFactory
                      .newInstance();
                  Transformer transformer = transformerFactory.newTransformer();
                  StringWriter stringWriter = new StringWriter();
                  transformer.transform(new DOMSource(webEngine.getDocument()),
                      new StreamResult(stringWriter));
                  String xml = stringWriter.getBuffer().toString();
                  System.out.println(xml);
                } catch (Exception e) {
                  e.printStackTrace();
                }

              }
            }); // addListener()

    // begin loading...
    webEngine.load("http://www.www.w3cschool.cn");

    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

通过 JavaScript 桥接生成 HTML5 内容

JavaFX 的 WebEngine AP I有一个 JavaScript 桥梁,允许 Java 代码调用 HTML5 内容中的 JavaScript 函数或脚本代码。

要获取原始 HTML5,您需要与 JavaScript 桥接器交互,以使用 Web 引擎的executeScript() 方法访问 Web 内容的 DOM。

以下代码访问HTML文档(DOM)以从 documentElement.outerHTML 获取原始内容:

String html  = (String)  webEngine.executeScript("document.documentElement.outerHTML");
import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;

public class Main extends Application {
  public static void main(String[] args) {
    Application.launch(args);
  }
  @Override
  public void start(Stage primaryStage) {
    WebEngine webEngine = new WebEngine();
    webEngine
        .getLoadWorker()
        .stateProperty()
        .addListener(
            (obs, oldValue, newValue) -> {
              System.out.println(newValue);
              if (newValue == State.SUCCEEDED) {
                System.out.println("finished loading");
                String html = (String) webEngine
                    .executeScript("document.documentElement.outerHTML");
                System.out.println(html);

              }
            }); 

    webEngine.load("http://www.www.w3cschool.cn");

    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

从 Java 传递到 JavaScript

以下代码显示了如何从 Java 代码调用 JavaScript 函数。

假设我们有一个具有以下JavaScript 函数的网页

... 
<script>
function  sayHello( msg ) {
    document.getElementById("my_message").innerHTML = msg;
}
</script>
<div id="my_message"></div>

我们可以从 Java 代码调用该函数 webEngine.executeScript(“sayHello("Hi there“);");

从 JavaScript 传递到 Java

JavaFX 允许JavaScript代码调用 Java 代码。

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
import jdk.nashorn.api.scripting.JSObject;

public class Main extends Application {
  public static void main(String[] args) {
    Application.launch(args);
  }

  @Override
  public void start(Stage primaryStage) {
    WebEngine webEngine = new WebEngine();
    webEngine.getLoadWorker().stateProperty()
        .addListener((obs, oldValue, newValue) -> {
          if (newValue == Worker.State.SUCCEEDED) {

            JSObject jsobj = (JSObject) webEngine.executeScript("window");
            jsobj.setMember("ABCD", new HelloWorld());
          }
        });

    webEngine.load("http://www.www.w3cschool.cn");

    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

class HelloWorld {
  public String sayGoodbye(String name) {
    return "hi:" + name;
  }
}

JavaScript代码调用 Java 代码

<script>
function sayGoodbye(name)  {
var  message  = ABCD.sayGoodbye(name);
document.getElementById("my_message").innerHTML = message;
}
</script>

<div  id="my_message"></div>

相关文章:

  • mybatis-plus进阶教程!超详细使用方法解析!
  • mybatis-plus入门教程!看完必懂!超详细解析!
  • Mybatis-Plus中的代码生成器AutoGenerator超详细解析!完整配置!
  • Mybatis plus关闭驼峰命名,防止出现查询为Null!四种方法超详细解析!
  • Spring体系结构超详细解析!
  • 自然语言处理系列之: NLP基础
  • 自然语言处理系列之:中文分词技术
  • 自然语言处理系列之:词性标注与命名实体识别
  • 自然语言处理系列之: 关键词提取算法
  • 自然语言处理系列之: 句法分析
  • 自然语言处理系列之:文本向量化
  • 自然语言处理系列之: 实战电影评论情感分析
  • 自然语言处理系列之: NLP中用到的机器学习算法
  • Java网络编程:UDP套接字程序设计,UDP实现Socket通信(附完整代码实现)
  • Java网络编程:邮件发送程序设计,SMPT传输协议实现(完整代码实现)
  • [Vue CLI 3] 配置解析之 css.extract
  • [译] 怎样写一个基础的编译器
  • Iterator 和 for...of 循环
  • Mac转Windows的拯救指南
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序--------语音识别(前端自己也能玩)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 自动记录MySQL慢查询快照脚本
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #1014 : Trie树
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十三)Maven插件解析运行机制
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)WLAN定义和基本架构转
  • ***监测系统的构建(chkrootkit )
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET多线程执行函数
  • .NET企业级应用架构设计系列之开场白
  • .NET项目中存在多个web.config文件时的加载顺序
  • .Net中间语言BeforeFieldInit
  • .考试倒计时43天!来提分啦!
  • /usr/bin/env: node: No such file or directory
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @requestBody写与不写的情况
  • [20170705]diff比较执行结果的内容.txt
  • [Android学习笔记]ScrollView的使用