Javafx 开发,用 webview 做界面可行吗? - 知乎 - TeamDev

选择用于嵌入跨平台桌面应用程序的 JavaFX Web 浏览器控件

JxBrowser和JavaFX WebView都允许您在跨平台Java桌面应用程序中引入web技术,以获得两者的最佳效果:web平台的普遍性和Java平台的强大功能。

JxBrowser 和 JavaFX WebView 有什么区别? 在本文中,我们将比较这些解决方案的架构、渲染、对最新 Web 标准(包括 HTML5、CSS3、JavaScript 等)的支持。

安装

JavaFX WebView 是在 2014 年成为 JDK 8 的一部分的 JavaFX 2.0 中引入的。如果您使用 Java 8,那么您不需要做任何特别的事情来开始使用 JavaFX WebView。 JDK 11 及更高版本不再捆绑 JavaFX,因此要使用 JavaFX 11 或更高版本进行开发,您必须单独下载

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

引擎

JavaFX WebKit 在内部使用 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 的 RAM。 您创建和加载网页的 WebView 实例越多,您的 Java 应用程序占用的 RAM 就越多。

JavaFX WebView架构

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

JxBrowser 架构

安全性

WebKit 是使用 C++ 编写的。 为了调用 WebKit 功能,JavaFX WebView 使用了 JNI。 由于 WebKit 在 JVM 中运行,任何错误或意外行为都可能导致 JVM 崩溃并意外终止您的 Java 应用程序。 终端用户的数据也可能会丢失或损坏。

如果 Chromium 出现错误,您的 Java 程序将继续运行。 JxBrowser 甚至提供了一个 API 来通知您 Chromium 进程中的意外终止或崩溃,因此您可以重新初始化和恢复用户会话以获得更好的用户体验。

Web标准

如果您在 JavaFX 17 WebView 和 JxBrowser 7.20 (Chromium 94) 中加载 http://html5test.com,您将获得以下结果:

JavaFX WebView 和 JxBrowser 中的 HTML5 功能支持

不同的 JavaFX 版本支持不同的 Web 标准。 例如,JavaFX 8 不可以在 YouTube 上播放视频:

并用一些工件渲染谷歌::

JavaFX 17 适用于相同的任务:

JavaFX 不支持 WebGL。

JavaFX WebView 和 JxBrowser 中的 WebGL 支持

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

被支持的 UI 工具包

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

JxBrowser 支持所有 Java UI 工具包,包括 JavaFX、Swing 和 SWT。 它提供了以下嵌入组件:

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

嵌入

编写带有地址栏和渲染当前加载网页的 Web View的简单 JavaFX 应用程序所需的工作是非常相似的。

JavaFX WebView

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);
 // Update address bar with URL of the loaded web page.
       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());
   }
}

JxBrowser

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);

        // Update address bar with URL of the loaded web page.
        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());

        // Close the engine when stage is about to close.
        primaryStage.setOnCloseRequest(event -> engine.close());
    }
}

API和功能

JavaFX WebView API:~1 个包,~10 个类和接口。 JavaFX WebView 代表一个简单的 Web 浏览器控件。 没有提供功能齐全的 Web 浏览器功能的目标,例如网络、SSL、身份验证、cookie、DevTools、插件、PDF 查看器等。

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

JxBrowser API:~60 个包,~580 个类和接口。 JxBrowser 封装并使用了一个功能齐全的 Web 浏览器应用程序。

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

支持和更新

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

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

所有拥有有效标准支持订阅的客户都可以免费使用所有新的 JxBrowser 版本,并直接从 JxBrowser 工程师那里获得技术支持。

几乎每个月都会发布一个新版本的 JxBrowser。

总结

如果您使用 JavaFX 开发软件,并且您需要显示一个简单的网页,而无需使用 HTML5 功能或高级 Web 浏览器功能,那么 JavaFX WebView 将非常适用于这种情况。

对于在 JavaFX、Swing 或 SWT 上进行时间敏感的商业软件开发,特定用例需要现代 Web 功能,并且必须符合最新的 Web 标准,JxBrowser 是一个更安全、更可定制的解决方案,由专门的开发团队支持。


原网址: 访问
创建于: 2023-08-23 15:08:35
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论