javafx之webEngine超详细解析

2023-05-16

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javafx之webEngine超详细解析 的相关文章

  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • Java NoSuchMethodException - 类中确实存在方法

    我正在构建一个 JavaFx 应用程序 我想创建一个接收 GridPane 和 Node 以及添加到窗格中的项目数量的方法 但是 当我调用该方法时 我收到 NoSuchMethodException 作为测试 我尝试创建一个简单的方法pri
  • Gluon 移动 iOS 音频播放器

    由于 JavaFx Media 尚未移植到移动平台 任何人都可以帮助我使用本机 iOS APi 来播放声音 mp3 文件 该文件将存储在我的 gluon 项目的 main resources 文件夹中 在 Android 上 我们可以轻松地
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • mobileapplication.mobileevent BACK_BUTTON_PRESSED

    我的两个视图中有 2 个 Android 本机音频实例 当用户按下后退按钮并离开视图时 我试图让音频停止 因为它不会自动发生 我查看了文档并看到了 MobileEvent 类 我尝试实现它的构造函数 但没有成功 这是我的第一个应用程序 为此
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • Java - ZUI(可缩放用户界面)

    我目前正在做一个小型个人项目 需要显示极其大量的数据 我突然想到实现一种可缩放的用户界面 以允许用户在大量数据中导航 我知道现有的项目 例如ZVTM http zvtm sourceforge net and 短笛2d https code
  • 如何在JavaFX中为TextArea设置圆角?

    我需要在 TextArea 上有圆角 但它看起来有点奇怪 看起来 有些内层也应该有相同半径的圆角 但是哪一个呢 我使用这个CSS text area fx background color dbb1b1 fff0f0 fx backgrou
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • 如何在 JavaFX 中设置滚动窗格的单位增量?

    The 滚动条 http docs oracle com javafx 2 api javafx scene control ScrollBar htmlJavaFX 中的类包含一个用于设置单位增量的属性 这就是我所追求的 但是我找不到如何
  • 如何在 JavaFX 中对单选按钮的最大可选复选框进行限制?

    请看下面的图片 您就会了解我的应用程序的布局 我希望能够动态选择多少CheckBox 启用下拉菜单 是可选的 固定数量 我想用这 3 个人来实现这个目标RadioButton 在垂直模式下全部 4CheckBox必须选择 不少于 在混合模式
  • JFrame 中的 JavaFX 菜单

    我想在 JFrame 中使用 JavaFX 菜单 我使用 JFXPanel 嵌入它 并且它在 JFrame 中可见 但是 问题是 菜单项不响应鼠标 我可以单击菜单 但不能单击菜单项 如果我使用键盘选择 MenuItem 并按 Enter 键
  • JavaFX 按钮不会禁用

    我有一个可能需要几秒钟到几分钟的任务 当我单击按钮执行该任务时 它会运行该任务但并不总是禁用按钮A和启用按钮B 这是我正在使用的代码 FXML public void onExecute ActionEvent event btnExecu
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看

随机推荐

  • vscode集成git

    vscode集成git 一 安装git 下载git安装包 xff0c 安装完git后配置环境变量 xff0c 在系统变量中的Path中新建 D software softwareInstall git Git cmd xff0c win 4
  • java中各种类型用Stream流求最大值最小值

    文章目录 java中各种类型用Stream流求最大值最小值一 BigDecimal 求最大值和最小值1 stream reduce 实现2 stream max 或stream min 实现 二 Integer 求最大值和最小值1 stre
  • idea:使用easyYapi插件导出yapi接口

    文章目录 idea xff1a 使用easyYapi插件导出yapi接口一 安装插件easyYapi二 配置easyYapiToken方式项目id方式 idea xff1a 使用easyYapi插件导出yapi接口 一 安装插件easyYa
  • springboot:各种下载文件的方式

    文章目录 springboot xff1a 各种下载文件的方式一 使用response输出流下载二 使用ResponseEntity三 注意 springboot xff1a 各种下载文件的方式 一 使用response输出流下载 注意第一
  • prometheus数据远程写入elasticsearch

    文章目录 prometheus数据远程写入elasticsearch一 部署elasticsearch二 部署prometheus三 通过prometheusbeat写入数据到es四 elasticsearch head验证 prometh
  • ElasticSearch 基本使用

    文章目录 ElasticSearch 基本使用一 简介二 参考文档三 ES核心概念核心概念数据类型 四 REST APIS索引API文档API查询文档API 五 SQL REST API ElasticSearch 基本使用 系统环境 El
  • SpringBoot集成Easy-Es

    文章目录 SpringBoot集成Easy Es一 集成demo二 索引CRUD创建索引查询索引更新索引删除索引 三 数据CURD四 参数文档 SpringBoot集成Easy Es Easy Es xff08 简称EE xff09 是一款
  • 最简单的markdown里面插入图片的办法 (用魔法打败魔法)

    这个问题困扰了我很久 xff1a 笔者非常喜欢用markdown 觉得他轻便 灵活 美观 xff0c 但是奈何 xff0c markdown里面插图片会显得有些棘手 xff0c 比方说最简单的用本地图片 markdown里面就是本机图片的路
  • c++面试必问:c++和c的8点不同

    前言 xff1a 最近发现很多面试题都会问到c 43 43 和c的不同 xff1b 总结一下 xff0c 发现遗漏的知识点还是挺多的 xff1b 比如c语言中 xff0c const关键字是个冒牌货 xff1b c 43 43 中struc
  • 01 - 树莓派简介以及烧录系统

    树莓派简介 指路B站 1 树莓派是什么 xff1f 树莓派就是计算机 xff0c 而计算机就是由运算器 控制器 I O设备等硬件部分以及由操作系统 应用程序组成的软件部分共同组成的整体 xff0c 即硬件和软件共同组成的整体就是计算机 xf
  • 上线啦,可以定时周期性提醒群成员的机器人

    这是站在巨人肩膀上的成果 啊 xff0c 有点夸张了 xff0c 总之简单地说 xff0c 熬了几个小时的探索和在洪振的小小帮助下实现了 xff0c 这个小小的但很有用的功能 实现钉钉机器人的自动周期性提醒群成员消息并可以选择是否 64 所
  • 如何在github上建立个人博客?

    如何在github上建立个人博客 xff1f Windows10 使用GitHub 43 Hexo 模板建立个人博客 前期准备 xff1a 1 git 2 node js 验证是否安装成功 xff1a win 43 r 输入 cmd 进入命
  • 用lvm为centos-root逻辑卷扩容

    在用linux进行开发的时候 xff0c 发现centos root下只有50G的空间 xff0c 不满足实际的需求 解决的方法有两种 xff0c 一种是外挂硬盘 xff0c 将其格式化并挂载在某目录下 xff08 如mnt xff09 x
  • STM32 IO模拟实现软件串口

    最近项目中STM32的串口资源紧张 xff0c 于是使用IO口进行模拟串口 xff0c 现进行整理记录 实现思路 IO口模拟串口的思路也比较简单 xff0c 一切按照串口协议进行操作即可 对于发送 xff0c 计算好不同波特率对应的延时时间
  • Linux命令大全(排版清晰!!持续更新!!非常详细)

    前言 最近在使用Linux的时候 xff0c 发现有很多命令不太会 在csdn查阅命令大全的时候 xff0c 发现很多文章都没有很好的排版 xff0c 于是写一篇文章 xff0c 希望能够帮助到大家 xff01 文章内容较多 xff0c 可
  • VScode 结合git的全面使用流程,再也不用记住git的命令了!

    前言 搭建 git 的环境 xff0c 能够方便的在服务器上管理好自己的代码 但是原始的git代码挺难记的 xff0c 而且会降低我们的工作效率 本文主要介绍如何使用vscode与git结合 xff0c 优雅的使用git git 介绍 这里
  • IntelliJ IDEA运行单个java类文件,并且不检查其他类的错误,通过编译

    IntelliJ IDEA运行单个java类文件 xff0c 并且不检查其他类的错误 xff0c 通过编译 前言 从Eclipse转换过来使用IDEA工具时执行java中的main方法块遇到一个问题 xff0c 当前java类的main方法
  • Java IO之:BufferedReader(超详细解析,使用方法说明)

    Java IO操作 BufferedReader 缓冲区读取内容 xff0c 避免中文乱码 要点 xff1a 掌握BufferedReader类的使用 掌握键盘输入的基本形式 Buffer xff1a 表示缓冲区的 之前的StringBuf
  • 一文搞定子网划分!子网掩码!超详细例题解析!

    子网划分理论基础 为什么进行子网划分 减少网络流量 xff0c 无论什么样的流量 xff0c 我们都希望它少些 xff0c 网络流量亦如此 如果没有可信赖的路由器 xff0c 网络流量可能导致整个网络停顿 xff0c 但有了路由器后 xff
  • javafx之webEngine超详细解析

    JavaFX WebEngine JavaFX教程 JavaFX WebEngine JavaFX 提供与 HTML5 内容互操作的功能 JavaFX 中的底层网页渲染引擎是名为 WebKit 的流行的开源API 此 API 用于 Appl