作为长期使用 C++ 和 Qt 进行桌面客户端开发的程序员,最初选择这套技术栈的理由非常充分:C++ 具备卓越的性能,Qt 拥有成熟的跨平台支持,并且对硬件操作友好,非常适合开发对性能有较高要求的桌面工具。
然而,在开发一款互联测试工具时,我遇到了一些挑战:
- 生态适配问题:对于某些协议库,例如 MQTT,Java 生态中有 Eclipse Paho 这类成熟且易用的开源库,开发者无需进行复杂的底层封装。
- UI 开发效率:Qt 的 UI 开发需要深入理解其信号槽机制,且自定义组件的开发成本较高。相比之下,JavaFX 采用的 FXML 结合 CSS 的开发模式,更贴近现代前端的开发逻辑,能更高效地构建现代化界面。
特别是考虑到团队协作成本,团队中熟悉 Java 技术栈的成员更多,采用 Java 与 JavaFX 能够显著降低协作门槛。
采用 Java/JavaFX 开发桌面测试工具的优势
使用 Java 与 JavaFX 重构桌面测试工具后(其核心功能是 MQTT 和 HTTP 协议测试),与之前的 C++/Qt 版本相比,新技术栈带来了以下几方面的提升:
协议开发效率显著提升
- Java 生态对物联网协议的支持更为丰富。例如,实现一个 MQTT 客户端,仅需引入 Eclipse Paho 依赖,几行代码即可完成客户端的创建、连接以及消息的发布与订阅。
- 而在 C++ 中,则需要自行对接 Paho MQTT 的 C /C++ 库,并处理大量的内存管理与封装工作。
界面现代化与高效实现
- JavaFX 内置了众多现代化的 UI 组件,如
TableView、TabPane、ProgressIndicator 等,并支持直接使用 CSS 修改组件样式,可以轻松打造符合当代审美标准的界面。
- 相较于 Qt,JavaFX 实现了界面代码与业务逻辑更彻底的分离。其 FXML (界面结构)、CSS (样式) 与 Controller (控制器) 三者结合的模式,清晰地将界面布局、视觉风格和交互逻辑解耦。这种模式与 Vue 或 React 这类现代前端框架的开发思路非常相似,新成员接手或修改界面时,完全不会影响核心业务代码。
跨平台与轻量化部署
- Qt 的跨平台部署需要打包相应的运行时库,通常会导致安装包体积较大。
- JavaFX 应用可以利用
jlink 工具,打包成一个仅包含程序所需 JDK 模块的轻量级运行镜像,最终安装包的体积可以控制在几十兆以内。
开发注意事项
思维模式的切换
- C++ 是面向过程与面向对象结合的语言,需要开发者关注内存管理;而 Java 是纯面向对象的语言,自带垃圾回收机制,开发者需要适应这种无需手动释放内存的模式。
- Qt 的核心通信机制是信号槽,而 JavaFX 则基于观察者模式的事件监听,需要适应这种不同的组件间通信逻辑。
性能的权衡
- Java 的绝对性能虽不及 C++,但对于物联网测试工具这类 CPU 密集型计算要求不高的应用场景,其性能完全能够满足需求。
Demo样例 - ClientAPP
本项目是一个基于 JavaFX 开发的现代化桌面应用程序示例,主要功能是进行 MQTT 和 HTTP 协议测试。市面上已有许多优秀开源工具,本项目的重点在于借此熟悉和展示 JavaFX 桌面应用的开发工具链。
技术栈
- Java 17:项目开发语言
- JavaFX 21:桌面 UI 框架
- Maven:项目构建与依赖管理
- Eclipse Paho (v1.2.5):MQTT 客户端库
- org.json:JSON 处理库
- ControlsFX:JavaFX 控件增强库
- FontAwesomeFX:图标库
项目结构
client-app/
├── .gitignore # Git忽略文件
├── pom.xml # Maven配置文件
├── README.md # 项目说明文档
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/clientapp/
│ │ ├── controllers/ # 控制器类
│ │ │ ├── MqttController.java # MQTT测试界面控制器
│ │ │ ├── HttpController.java # HTTP测试界面控制器
│ │ │ └── AboutController.java # About界面控制器
│ │ ├── MainApp.java # 主应用类
│ │ └── Main.java # 启动类
│ └── resources/
│ └── com/example/clientapp/
│ ├── css/ # 样式文件
│ │ └── main.css # 主样式文件
│ ├── fxml/ # FXML界面文件
│ │ ├── about.fxml # About界面
│ │ ├── http.fxml # HTTP测试界面
│ │ └── mqtt.fxml # MQTT测试界面
│ └── images/ # 图片资源目录
└── target/ # 构建输出目录
├── installer/ # 安装程序输出目录(javapackager生成)
└── libs/ # 依赖库目录
构建与运行
构建项目
执行 Maven 构建命令:
mvn clean package
构建成功后,可执行的 JAR 文件将生成在 target 目录下。
运行项目
方式一:通过 Maven 运行
mvn javafx:run
方式二:直接运行 JAR 文件
java -jar target/client-app-1.0-SNAPSHOT.jar
注意:由于 JavaFX 模块化的特性,直接运行 JAR 文件可能需要配置模块路径。更建议使用方式一或通过 IDE 运行。
或者,运行包含所有依赖的 fat JAR:
java -jar target/client-app-1.0-SNAPSHOT-jar-with-dependencies.jar
方式三:通过 IDE 运行
- 在 IntelliJ IDEA 或 Eclipse 中导入项目。
- 确保已安装 JavaFX 插件或正确配置运行环境。
- 配置 JDK 17 或更高版本作为项目 SDK。
- 运行
Main.java 类中的 main 方法。
应用界面预览
启动后的应用程序界面如下,展示了基于 JavaFX 构建的现代化标签页式布局和清晰的交互设计。
|