无论是 JxBrowser 还是 JavaFX WebView,它们都能使开发者在跨平台的 Java 桌面应用中引入网络技术,从而兼收并蓄:既拥有网络平台的普遍性,又具备 Java 平台的强大功能。

在选择 JxBrowser 之前,我们的客户时常会询问我们关于 JxBrowser 与 JavaFX WebView 之间的区别。在本文中,我们将从架构、渲染、对最新 Web 标准(包括 HTML5、CSS3、JavaScript 等)的支持等方面,对这两种解决方案进行比较。

简而言之

如果您使用 JavaFX 开发软件,且只是想显示一个简单的网页,并不需要 HTML5 或高级浏览器功能,那么 JavaFX WebView 足以满足您的需求。

而对于那些基于 JavaFX、Swing 或 SWT 开发的商业软件项目,特别是那些对稳定性、及时的技术支持和高效的沟通有着严格要求的项目,JxBrowser 无疑是更可靠的选择。

安装

JavaFX WebView 在 JavaFX 2.0 中引入,并在 2014 年成为 JDK 8 的一部分。如果您使用的是 Java 8,则无需执行任何特殊操作即可开始使用 JavaFX WebView。而对于 JDK 11 及更高版本,JavaFX 不再捆绑其中,因此,如果您想使用 JavaFX 11 或更高版本进行开发,则需要单独 下载它。

JxBrowser 是一个第三方库,您需要将其作为依赖项添加到项目中。您可以简单地下载它并将其添加到应用程序的类路径中,或者快速将其添加到 GradleMaven 项目中。

为个人和企业提供 30 天免费试用
立即体验

引擎

JavaFX WebView 内部使用 WebKit。而 JxBrowser 则在其底层采用功能完备的 Chromium。这两种解决方案都包含了所有必要的引擎二进制文件,因此不需要终端用户安装 Chromium 或 Safari。

渲染

由于 WebKit 不渲染网页,因此 JavaFX 开发人员必须实现一个单独的轻量级(离屏)渲染器。JavaFX 17 中的 WebView 能够很好地渲染网页,因此在显示效果上与 Safari、Mozilla Firefox 或 Google Chrome 相比,不会有任何明显的差异。

在 JxBrowser 中,网页由 Chromium 使用 GPU 进行渲染,因此,它们的外观看起来与 Google Chrome 中的网页完全相同。JxBrowser 支持两种渲染模式:离屏和硬件加速。

架构

JavaFX 在您的 Java 进程中初始化和运行 WebKit。这种方法的优势在于,与 JxBrowser 相比,JavaFX 能够更快速地创建和显示 WebView。而 JxBrowser 则需要首先启动一个外部的 Chromium 进程。然而,为了达到这样的速度,WebKit 会在 Java 进程中分配并使用内存和 CPU。一些现代的网页可能会占用超过 1GB 的内存。创建的 WebView 实例越多,加载的网页越多,Java 应用程序占用的 RAM 就会越多。

JavaFX WebView 架构

JavaFX WebView 架构

JxBrowser 在单独的本地进程中运行 Chromium,并通过进程间通信(IPC)桥与其进行通信。通过这种解决方案,Chromium 不会影响您 Java 应用程序的内存使用。此外,JxBrowser 支持 Chromium 的多进程架构。如果某个网页或 JavaScript 由于某种原因崩溃,Chromium 将继续运行,您甚至可以恢复崩溃的网页。

JxBrowser 架构

JxBrowser 架构

安全性

WebKit 是使用 C++ 编写的。为了调用 WebKit 的功能,JavaFX WebView 使用 JNI。然而,由于 WebKit 在 JVM 内部运行,因此任何错误或异常行为都有可能导致 JVM 崩溃,进而意外终止您的 Java 应用程序。在这种情况下,终端用户的数据可能会面临丢失或损坏的风险。

相比之下,如果 Chromium 发生错误,您的 Java 程序仍将继续运行。JxBrowser 甚至提供了一个 API 来通知您 Chromium 进程发生了意外终止或崩溃,以便您可以重新初始化并恢复用户会话,从而提供更好的用户体验。

Web 标准

如果您在 JavaFX 21 WebView 和 JxBrowser 7.38.2(Chromium 124)中加载 https://html5test.teamdev.com/,您将得到以下结果:

JavaFX WebView 和 JxBrowser 对 HTML5 功能的支持情况

JavaFX WebView 和 JxBrowser 对 HTML5 功能的支持情况

不同的 JavaFX 版本支持不同的 Web 标准。例如,JavaFX 8 在 YouTube 上完全无法播放视频。

JavaFX WebView YouTube

并且在渲染 Google 时会产生一些伪影:

JavaFX WebView Google

JavaFX 17 在执行相同任务时表现良好:

JavaFx 17 WebView YouTube

JavaFx 17 WebView Google

JavaFX 不支持 WebGL。

WebGL 支持

JavaFX WebView 和 JxBrowser 对 WebGL 的支持情况

即使在 JavaFX 17 中,Google 地图也无法正确显示。

Google 地图

支持的 UI 工具包

JavaFX WebView 可以无缝地用于 JavaFX 应用程序。如果您使用 Java Swing 或 SWT 来开发应用程序,则可以通过 JFXPanel 和 FXCanvas 嵌入 JavaFX WebView。

JxBrowser 支持所有 Java UI 工具包,包括 JavaFXSwingSWT。它提供了以下用于嵌入的组件:

  • com.teamdev.jxbrowser.view.swing.BrowserView
  • com.teamdev.jxbrowser.view.javafx.BrowserView
  • com.teamdev.jxbrowser.view.swt.BrowserView

嵌入

编写一个带有地址栏和呈现当前加载网页的 Web 视图的简单 JavaFX 应用程序所需的工作非常相似。

JavaFX WebView
JxBrowser
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public final class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebView view = new WebView();
        WebEngine engine = view.getEngine();

        BorderPane root = new BorderPane(view);

        TextField addressBar = new TextField("https://google.com");
        addressBar.setOnAction(event -> 
                engine.load(addressBar.getText()));
        root.setTop(addressBar);

        // 使用已加载网页的 URL 更新地址栏。
        engine.locationProperty().addListener((observable, oldValue, newValue) ->
                addressBar.setText(newValue));

        primaryStage.setTitle("JavaFX WebView");
        primaryStage.setScene(new Scene(root, 1000, 600));
        primaryStage.show();

        engine.load(addressBar.getText());
    }
}
import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.navigation.event.NavigationFinished;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public final class SmokeTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
        Browser browser = engine.newBrowser();
        BrowserView view = BrowserView.newInstance(browser);

        BorderPane root = new BorderPane(view);

        TextField addressBar = new TextField("https://google.com");
        addressBar.setOnAction(event -> 
                browser.navigation().loadUrl(addressBar.getText()));
        root.setTop(addressBar);

        // 使用加载网页的 URL 更新地址栏。
        browser.navigation().on(NavigationFinished.class, event -> {
            if (event.isInMainFrame()) {
                addressBar.setText(event.url());
            }
        });

        primaryStage.setTitle("JxBrowser");
        primaryStage.setScene(new Scene(root, 1000, 600));
        primaryStage.show();

        browser.navigation().loadUrl(addressBar.getText());

        // 当窗口即将关闭时关闭引擎。
        primaryStage.setOnCloseRequest(event -> engine.close());
    }
}

API 和功能

JavaFX WebView API: 包含约 1 个包,10 个类和接口。JavaFX WebView 是一个简单的 Web 浏览器控件。并没有目标提供功能全面的 Web 浏览器功能,如网络、SSL、认证、cookies、DevTools、插件、PDF 查看器等。

该 API 提供了基本的 Web 浏览器功能,包括加载网页,获取各种加载事件,访问和修改 DOM,执行 JavaScript,通过将 Java 对象注入 JavaScript 来从 JavaScript 调用 Java,处理弹出窗口,以及显示 JavaScript 对话框,如警告、确认和提示。

JxBrowser API: 包含约 60 个包,580 个类和接口。JxBrowser 在底层封装并使用了功能全面的 Web 浏览器应用程序。

该 API 提供了对数百个 Chromium 功能的访问,例如管理配置文件,包括隐身模式、插件、代理、cookies、拼写检查、下载、权限、认证(代理、基本、摘要、NTLM、SSL 客户端证书、SuisseID、U2F、集成的 Windows 认证和 Kerberos)、密码、缩放、打印、DevTools、网络、自定义协议等 更多功能

支持与更新

JavaFX 是一个开源项目。如果您发现了漏洞或缺少某个功能,您可以做出 贡献。JavaFX 遵循 OpenJDK 的 6 个月发布周期。 每 6 个月发布一个新版本。目前尚不清楚 WebKit 引擎多久会升级到支持最新 Web 标准且包含已报告安全漏洞修复的最新版本。

JxBrowser 是一款商业产品,专为对集成第三方解决方案的质量和支持有较高要求的商业公司设计,以及使用 Java 技术开发软件的公司。该产品自 2007 年以来一直由 TeamDev 公司负责开发和提供技术支持。

所有拥有有效 标准支持订阅的客户都可以免费使用所有新的 JxBrowser 版本,并直接从 JxBrowser 工程师那里获得技术支持。如果您发现漏洞或缺少某项功能,我们将在合理的时间内进行修复、实现所需功能,并为您提供库的新版本。

JxBrowser 几乎每个月都会发布新版本。我们会在 Chromium 正式发布后 3-4 周内将其升级到最新的稳定版本(包含最新的安全补丁和已修复的漏洞)。