麒麟正青春

 

JavaFX中WebView与JxBrowser

JavaFX WebView 与 JxBrowser 对比指南


‌一、架构与渲染能力‌

  1. ‌WebView‌

    • ‌核心引擎‌:基于 ‌WebKit‌(JDK 8 内置),支持 HTML4、CSS2 及基础 JavaScript,但 HTML5/CSS3/ES6 等新标准兼容性有限‌
    • ‌性能‌:轻量级,适合简单页面展示(如静态文本、基础表单),但复杂页面(含视频、动态渲染)易出现卡顿或加载延迟‌
  2. ‌JxBrowser‌

    • ‌核心引擎‌:基于 ‌Chromium‌(与 Chrome 同源),完整支持 HTML5/CSS3/WebGL 等现代 Web 标准,渲染效率更高‌
    • ‌性能‌:适用于高交互场景(如数据可视化、多媒体播放),资源占用较高但响应速度稳定‌

‌二、功能特性对比‌

‌特性‌‌WebView‌‌JxBrowser‌
‌JavaScript 交互‌ 支持 JSObject 双向调用,但复杂脚本易崩溃‌
通过 JavaScript API 实现无缝通信,支持 Chrome 扩展集成‌
‌跨域请求‌ 受限较多,需手动处理跨域策略‌
默认支持跨域,可配置网络拦截规则‌67。
‌本地文件加载‌ 支持 file:// 协议,但路径格式敏感‌
默认禁用,需启用 file:// 或通过 HTTP 服务器托管‌
‌打印与截图‌ 依赖 JavaFX 原生 API,功能有限‌
提供 PrintJob 和 CaptureScreen 接口,支持 PDF 导出‌

‌三、适用场景建议‌

  1. ‌WebView 推荐场景‌

    • 轻量级工具:如内嵌帮助文档、静态报表展示。
    • 成本敏感项目:无需商业授权,适合非商业或低预算需求‌
  2. ‌JxBrowser 推荐场景‌

    • 企业级应用:需稳定支持复杂 Web 功能(如在线编辑器、实时图表)。
    • 商业软件:依赖 Chromium 特性(如 DevTools 调试、Chrome 扩展)且需官方技术支持‌

‌四、开发与维护成本‌

  • ‌集成复杂度‌
    • WebView 内置于 JDK,无需额外配置;JxBrowser 需添加 Maven/Gradle 依赖并处理平台兼容性‌
  • ‌授权成本‌
    • WebView 免费开源;JxBrowser 需购买商业许可(30 天试用期后功能受限)‌

‌五、综合建议‌

  • ‌优先选 WebView‌:若项目仅需基础网页展示且对性能要求低,可降低开发复杂度与成本‌
  • ‌必选 JxBrowser‌:若涉及现代 Web 技术(如 WebAssembly、WebRTC)或需高性能渲染,建议接受其商业授权成本‌

六、jxbrowser的试用

1、登录https://teamdev.cn/jxbrowser/官网,申请试用key,会将key和库下载地址及教程发送到邮箱

2、下载库:jxbrowser-8.5.2-cross-desktop-win_mac_linux.zip,解压后使用到的jar文件如下

3、将库文件放入项目用到的本地仓库中,根据名称放到对应目录下

 

 4、通过idea创建javafx项目,pom.xml文件设置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.wyrjgs</groupId>
<artifactId>jxbrowsertest1</artifactId>
<version>1.0-SNAPSHOT</version>
<name>jxbrowsertest1</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.9.2</junit.version>
<jxbrowser.version>8.5.2</jxbrowser.version>
<!-- exec.mainClass需要改标签否则执行时提示:无法找到主类-->
<exec.mainClass>com.wyrjgs.jxbrowsertest1.HelloApplication</exec.mainClass>
</properties>
<!-- <pluginRepositories>-->
<!-- <pluginRepository>-->
<!-- <id>com.teamdev</id>-->
<!-- <url>https://europe-maven.pkg.dev/jxbrowser/eaps</url>-->
<!-- </pluginRepository>-->
<!-- </pluginRepositories>-->
<repositories>
<repository>
<id>com.teamdev</id>
<url>https://europe-maven.pkg.dev/jxbrowser/releases</url>
</repository>
</repositories>

<dependencies>

<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.6</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17.0.6</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.teamdev.jxbrowser</groupId>-->
<!-- <artifactId>jxbrowser-cross-platform</artifactId>-->
<!-- <version>${jxbrowser.version}</version>-->
<!-- <type>pom</type>-->
<!-- </dependency>-->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser</artifactId>
<version>${jxbrowser.version}</version>
</dependency>
<!-- 针对移动设备的-->
<!-- <dependency>-->
<!-- <groupId>com.teamdev.jxbrowser</groupId>-->
<!-- <artifactId>jxbrowser-compose</artifactId>-->
<!-- <version>${jxbrowser.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-win64</artifactId>
<version>${jxbrowser.version}</version>
</dependency>
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-javafx</artifactId>
<version>${jxbrowser.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<executions>
<execution>
<!-- Default configuration for running with: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>com.wyrjgs.jxbrowsertest1/com.wyrjgs.jxbrowsertest1.HelloApplication</mainClass>
<launcher>app</launcher>
<jlinkZipName>app</jlinkZipName>
<jlinkImageName>app</jlinkImageName>
<noManPages>true</noManPages>
<stripDebug>true</stripDebug>
<noHeaderFiles>true</noHeaderFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

5、module-info.java
module com.wyrjgs.jxbrowsertest1 {
requires javafx.controls;
requires javafx.fxml;
requires jxbrowser;
requires jxbrowser.javafx;


opens com.wyrjgs.jxbrowsertest1 to javafx.fxml;
exports com.wyrjgs.jxbrowsertest1;
}

6、应用文件
package com.wyrjgs.jxbrowsertest1;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;
import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;


public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
//1、通过maven命令执行程序,可以正常运行测试:mvn clean compile exec:java -Djxbrowser.license.key=<your_license_key>
//mvn clean compile exec:java -Djxbrowser.license.key=<your_license_key>OK6AEKNYF3CK8B84TCUIY6RFFXCEK34EB6D2F0JX2I1FFK01HZVNHS2PHUJ3V270AE9W8UBU7I37BQL66U8IZQ33HTHHZBN1UW7NSMJOVDRF31E0O6ONVGHISQR8FWNIVQJ8Z69HXF34SUW8F
//mvn clean compile exec:java -Djxbrowser.license.key=OK6AEKNYF3CK8B84TCUIY6RFFXCEK34EB6D2F0JX2I1FFK01HZVNHS2PHUJ3V270AE9W8UBU7I37BQL66U8IZQ33HTHHZBN1UW7NSMJOVDRF31E0O6ONVGHISQR8FWNIVQJ8Z69HXF34SUW8F

    // 2、设置您的 JxBrowser 许可证密钥。可以直接运行
    System.setProperty("jxbrowser.license.key", "OK6AEKNYF3CK8B84TCUIY6RFFXCEK34EB6D2F0JX2I1FFK01HZVNHS2PHUJ3V270AE9W8UBU7I37BQL66U8IZQ33HTHHZBN1UW7NSMJOVDRF31E0O6ONVGHISQR8FWNIVQJ8Z69HXF34SUW8F");


// Initialize Chromium.
var engine = Engine.newInstance(HARDWARE_ACCELERATED);

// BrowserContextParams params = new BrowserContextParams("path/to/data/dir");
// params.setAllowFileAccess(true); // 启用文件协议
// BrowserContext context = new BrowserContext(params);
//Browser browser = new Browser(context);

var browser = engine.newBrowser();

// Load the required web page.
browser.navigation().loadUrl("http://www.wyrjgs.cn");
// browser.navigation().loadUrl("file:///E:/spredjs-xls/index.html");//加载本地文件

// Create and embed JavaFX BrowserView component to display web content.
var view = BrowserView.newInstance(browser);
var scene = new Scene(new BorderPane(view), 1280, 800);
stage.setTitle("JxBrowser JavaFX");
stage.setScene(scene);
stage.show();
// Shutdown Chromium and release allocated resources.
stage.setOnCloseRequest(event -> engine.close());

// 通过FXML加载页面,
Stage stage2 = new Stage();
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene2 = null;
try {
scene2 = new Scene(fxmlLoader.load(), 320, 240);
} catch (IOException e) {
throw new RuntimeException(e);
}
stage2.setTitle("Hello!");
stage2.setScene(scene2);
stage2.show();

}

public static void main(String[] args) {
launch();
}
}
7、自定义视图类 FxmlBrowserView.java
package com.wyrjgs.jxbrowsertest1;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.RenderingMode;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.scene.layout.StackPane;

/**
* 一个用于 JavaFX {@link BrowserView} 的包装组件,
* 允许在 FXML 应用程序中使用 BrowserView 实例。
* 由于 JavaFX 的 BrowserView 没有提供默认的公共构造函数,
* 因此无法直接在 FXML 中使用。
*/
public final class FxmlBrowserView extends StackPane {

private final Browser browser;

/**
* 构造一个 {@code FxmlBrowserView} 的实例。
*/
public FxmlBrowserView() {
var engine = Engine.newInstance(RenderingMode.HARDWARE_ACCELERATED);
browser = engine.newBrowser();
var view = BrowserView.newInstance(browser);
getChildren().add(view);
}

/**
* 返回当前 Browser View 的 {@link Browser} 实例。
*/
public Browser browser() {
return browser;
}
}
8、视图文件hello-view.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import com.wyrjgs.jxbrowsertest1.FxmlBrowserView?>
<BorderPane
fx:controller="com.wyrjgs.jxbrowsertest1.HelloController"
xmlns:fx="http://javafx.com/fxml">
<top>
<TextField fx:id="textField" text="http://www.wyrjgs.cn"
onAction="#loadUrl"/>
</top>
<center>
<FxmlBrowserView fx:id="browserView"/>
</center>
</BorderPane>

 9、控制器文件HelloController.java

package com.wyrjgs.jxbrowsertest1;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

import java.net.URL;
import java.util.ResourceBundle;

public class HelloController implements Initializable {
@FXML
private TextField textField;

@FXML
private FxmlBrowserView browserView;

@Override
public void initialize(URL location, ResourceBundle resources) {
browserView.browser().navigation().loadUrl(textField.getText());
}

public void loadUrl(ActionEvent actionEvent) {
browserView.browser().navigation().loadUrl(textField.getText());
}
}
10、通过maven命令运行,否则无法成功。将<your_license_key>替换为你申请的试用key即可
mvn clean compile exec:java -Djxbrowser.license.key=<your_license_key>

11、运行结果

 

 

 

posted on 2025-04-16 16:39  麒麟正青春  阅读(304)  评论(0)    收藏  举报

导航