Java桌面应用开发:JavaFX模块化与响应式

news/2025/11/1 17:07:54/文章来源:https://www.cnblogs.com/theissky/p/19183565

一、技术选型对比
1.1 JavaFX
JavaFX 是 Oracle 推出的新一代 Java 桌面应用开发框架,具有以下特点:

现代 UI 设计:支持 CSS 样式、3D 效果和动画
丰富的控件库:包含 TableView、WebView 等高级组件
FXML 分离设计:界面与逻辑分离,提高开发效率
内置媒体支持:直接播放音频视频
响应式布局:支持锚点、流式和网格布局

1.2 Java Swing
Java Swing 是传统的 Java 桌面应用框架,特点如下:

广泛兼容性:支持从 JDK 1.2 到最新版本
轻量级:资源占用少,适合小型应用
高度可定制:可以自定义 LookAndFeel
丰富的插件生态:如 JFreeChart、JXTable 等
成熟稳定:经过长时间的市场验证

1.3 选型建议
场景 JavaFX Java Swing
现代 UI 需求 推荐 不推荐
跨平台一致性 较好 需要额外配置
初学者友好度 较高 较低(API 复杂)
大型项目 推荐(模块化设计) 可使用(但架构复杂)
性能敏感应用 一般(需优化) 较好

一、JavaFX 19+ 技术栈升级

1.1 模块化开发

Java 9+ 引入的模块系统解决了类路径混乱问题,在 module-info.java 中明确声明依赖:

module com.techprimers.javafx {requires javafx.controls;requires javafx.fxml;requires java.sql;requires org.slf4j;exports com.techprimers.javafx;exports com.techprimers.javafx.controller;opens com.techprimers.javafx.view to javafx.fxml;
}
 
 

1.2 响应式UI设计

使用最新的 JavaFX 布局管理器和 CSS 变量实现自适应界面:

/* styles.css */
:root {-fx-primary-color: #4a86e8;-fx-secondary-color: #f1c232;-fx-accent-color: #6aa84f;-fx-dark-color: #202020;
}.table-view {-fx-background-color: transparent;
}.button {-fx-background-color: -fx-primary-color;-fx-text-fill: white;-fx-padding: 8px 16px;-fx-background-radius: 4px;
}.button:hover {-fx-background-color: derive(-fx-primary-color, -10%);
}
 
 

二、现代化数据访问层

2.1 使用 JDBC 4.3

JavaFX 与最新 JDBC API 集成,支持自动资源管理:

// BookRepository.java
public List<Book> findAll() {String sql = "SELECT * FROM books";try (Connection conn = dataSource.getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql)) {return rs.stream().map(this::mapToBook).toList();} catch (SQLException e) {logger.error("Database error", e);return Collections.emptyList();}
}
 
 

2.2 异步数据加载

使用 JavaFX 任务处理耗时操作,避免 UI 冻结:

// BookService.java
public void loadBooksAsync(Consumer<List<Book>> callback) {Task<List<Book>> task = new Task<>() {@Overrideprotected List<Book> call() {return bookRepository.findAll();}};task.setOnSucceeded(event -> callback.accept(task.getValue()));task.setOnFailed(event -> logger.error("Load books failed", task.getException()));new Thread(task).start();
}
 

三、高级UI组件实战

3.1 自定义表格渲染

创建可排序、可筛选的表格视图:

// BookTableView.java
public class BookTableView extends TableView<Book> {public BookTableView() {TableColumn<Book, Integer> idCol = new TableColumn<>("ID");idCol.setCellValueFactory(new PropertyValueFactory<>("id"));TableColumn<Book, String> titleCol = new TableColumn<>("书名");titleCol.setCellValueFactory(new PropertyValueFactory<>("title"));TableColumn<Book, String> authorCol = new TableColumn<>("作者");authorCol.setCellValueFactory(new PropertyValueFactory<>("author"));getColumns().addAll(idCol, titleCol, authorCol);setItems(FXCollections.observableArrayList());setPrefHeight(400);}
}
 

3.2 图表可视化

集成 JavaFX Charts 实现数据可视化:

// SalesChart.java
public class SalesChart extends LineChart<Number, Number> {public SalesChart() {super(new NumberAxis("月份"), new NumberAxis("销量"));setTitle("图书销售趋势");XYChart.Series<Number, Number> series = new XYChart.Series<>();series.setName("2023年销量");// 添加数据点series.getData().add(new XYChart.Data<>(1, 120));series.getData().add(new XYChart.Data<>(2, 190));// ...getData().add(series);}
}
 

四、MVVM架构实现

4.1 使用JavaFX Properties

实现视图模型层,支持数据绑定:

// BookViewModel.java
public class BookViewModel {private final ObservableList<Book> books = FXCollections.observableArrayList();private final StringProperty searchText = new SimpleStringProperty();public BookViewModel(BookService bookService) {// 初始化数据bookService.loadBooksAsync(books::setAll);// 搜索功能searchText.addListener((obs, oldVal, newVal) -> bookService.searchBooks(newVal, updatedBooks -> books.setAll(updatedBooks)));}// Getterspublic ObservableList<Book> getBooks() {return books; }public StringProperty searchTextProperty() {return searchText; }
}
 

4.2 FXML控制器集成

在控制器中注入视图模型:

// BookController.java
public class BookController {@FXML private BookTableView bookTable;@FXML private TextField searchField;@FXML private Button addButton;private BookViewModel viewModel;@FXMLprivate void initialize() {// 数据绑定bookTable.setItems(viewModel.getBooks());searchField.textProperty().bindBidirectional(viewModel.searchTextProperty());// 事件处理addButton.setOnAction(event -> showAddBookDialog());}public void setViewModel(BookViewModel viewModel) {this.viewModel = viewModel;}
}
 

五、应用部署优化

5.1 使用 jlink 创建自定义运行时

生成精简的 JRE 运行环境:

jlink --module-path $JAVA_HOME/jmods:target/mods \--add-modules com.techprimers.javafx \--output target/bookapp-runtime \--strip-debug \--compress 2 \--no-header-files \--no-man-pages
 
 

5.2 打包为原生安装包

使用 jpackage 创建平台特定安装程序:

jpackage --input target/ \--name BookManager \--main-class com.techprimers.javafx.Main \--main-jar bookmanager.jar \--type dmg \--icon src/main/resources/icons/app.icns \--app-version 1.0.0 \--vendor "TechPrimers" \--dest target/installers
 
 

六、实战案例:响应式图书管理系统

下面是一个完整的 JavaFX 应用结构示例:

bookmanager-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/techprimers/javafx/
│   │   │       ├── Main.java                      // 应用入口
│   │   │       ├── module-info.java               // 模块定义
│   │   │       ├── config/
│   │   │       │   └── AppConfig.java             // 应用配置
│   │   │       ├── model/
│   │   │       │   ├── Book.java                  // 数据模型
│   │   │       │   └── BookProperty.java          // JavaFX属性包装
│   │   │       ├── repository/
│   │   │       │   └── BookRepository.java        // 数据访问
│   │   │       ├── service/
│   │   │       │   └── BookService.java           // 业务逻辑
│   │   │       ├── viewmodel/
│   │   │       │   └── BookViewModel.java         // 视图模型
│   │   │       ├── view/
│   │   │       │   ├── BookTableView.java         // 自定义表格
│   │   │       │   └── SalesChart.java            // 图表组件
│   │   │       ├── controller/
│   │   │       │   └── BookController.java        // FXML控制器
│   │   │       └── util/
│   │   │           ├── DBUtil.java                // 数据库工具
│   │   │           └── ViewLoader.java            // 视图加载器
│   │   └── resources/
│   │       └── com/techprimers/javafx/
│   │           ├── views/
│   │           │   ├── bookView.fxml              // 主视图
│   │           │   └── addBookDialog.fxml         // 添加对话框
│   │           ├── styles/
│   │           │   └── app.css                    // 全局样式
│   │           └── images/
│   │               └── icons/                     // 图标资源
├── pom.xml                          // Maven配置
└── .gitignore                       // Git忽略配置
 
 

这个架构充分利用了 JavaFX 19+ 的新特性,包括模块化系统、响应式布局和异步处理,同时遵循了现代软件开发最佳实践,实现了关注点分离和可测试性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 动态标签

配置文件示例 #应用程序名称 spring.application.name=configuration #应用程序端口号 server.port=8080 #数据库连接信息 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/database_name?characterEncoding=utf8…

用 CSS Grid 实现高效布局的 3 个实战技巧

1. 动态网格:auto-fit + minmax() 响应式适配 无需媒体查询!一行代码创建自适应列: .grid-container {display: grid;grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } auto-fit:自动填充可用空间…

【Linux 高效的系统】文件系统与软硬件连接

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Webpack技术深度解析:模块打包与性能优化

在前端开发的浩瀚星空中,Webpack无疑是一颗璀璨的明星。作为现代前端工程不可或缺的一部分,Webpack以其强大的模块打包能力和高度的灵活性,赢得了广大开发者的青睐。本文将深入探讨Webpack的核心概念、配置优化以及…

Pinely Round 5 (Div. 1 + Div. 2) A+B+C+D

A.Round Trip原题链接 解题思路简单贪心模拟一下,能减则减AC code void solve(){int r,x,d,n;cin>>r>>x>>d>>n;string s;cin>>s;s="&"+s;int ans=0;for(int i=1;i<=n;…

Spring Web MVC入门 - 指南

Spring Web MVC入门 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

CSS:现代Web设计的不同技术

CSS(层叠样式表)是为HTML提供样式的主要语言。随着Web的发展,CSS也不断演进,融入了许多新特性和技术,帮助开发者创建更美观和功能丰富的网站。本文将探讨CSS的几种不同技术,包括Flexbox、Grid、动画效果、预处理…

左手坐标系和右手坐标系

左手坐标系和右手坐标系1. 左手坐标系 伸开左手,掌心向外,拇指和食指垂直,弯曲中指、无名指和小指。拇指所指的方向是X轴正方向,食指所指的方向是Y轴正方形,中指、无名指和小指所指的方向是Z轴正方向。 2. 右手坐…

ubuntu24 主题体验经验

一、主题来源网站 https://www.gnome-look.org/s/Gnome/browse?cat=135&page=11&ord=rating 二、主题安装文件夹 & 设置创建文件夹 ~/.themes 下载的主题直接扔到这个文件夹。好处有2 (1) 简单,不用权…

图神经网络(GNN)

一、概念 1、GNN是处理图结构数据的深度学习模型,核心是通过图卷积、注意力机制等操作,让节点学习自身与邻居的关联信息,最终输出节点 / 图的特征或预测结果 2、传统深度学习(CNN、RNN)擅长处理网格数据(如图片)…

docker部署OpenResume 开源简历生成器

采用现代专业设计,符合美国最佳实践,并与 Greenhouse 和 Lever 等主流 ATS 平台兼容。它能自动设置字体、字号、页边距和项目符号格式,确保一致性并避免人为错误。官网:GitHub - xitanggg/open-resume: OpenResume…

深入解析:MySQL 配置管理与日志系统完全指南:从基础到高级优化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

不使用 AAudio 的前提下,降低 Android 音频传输延时的方案

如果芯片厂未实现 MMAP 驱动接口,那么即使客户端代码调用了 AAudio 接口,也无法降低音频传输延时。因为 AAudio 会回退到以 legacy 模式工作。在芯片驱动不支持使用 AAudio 的前提下,我们可以通过其它方式来减少音频…

深入解析:dmfldr快速装载工具使用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

OpenAPI 3 所有常用注解的实际用法

OpenAPI 3 所有常用注解的实际用法OpenAPI 3 所有常用注解的实际用法 一个完整的 Spring Boot + SpringDoc 示例,涵盖了 OpenAPI 3 所有常用注解的实际用法,包括接口分组、参数说明、响应结构、模型字段描述、隐藏接…

LINQ 表达式详解

1. 基础概念与用法 1.1 什么是 LINQ? LINQ 是 .NET Framework 3.5 引入的一项特性,它将查询能力直接集成到 C# 语言中。通过 LINQ,你可以像写 SQL 一样对内存中的集合(如 List<T>、数组)或外部数据源(如数…

任务---网络通信组件JsonRpc

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

K230使用RTSP实现无线图传

K230 使用 RTSP 实现无线图传 效果图开发环境开发板:LCKFB-LSPI-K230-1G-CanMV 固件:CanMV_K230_LCKFB_micropython_v1.4-0-g6cce59c_nncase_v2.9.0.img IDE:CanMV K230 播放器:VLC 播放器RTSP 介绍 RTSP(Real-Time S…

英语背单词 专八词汇 中英对照 2025年11月

2025-11-022025-11-01Index Word Pronunciation Parts of Speech Explanation Translation in Chinese1 lineage /ˈlɪnɪɪdʒ/ noun A line of descendants from a particular ancestor; ancestry or heritage; fam…

CodeForces-2138B Antiamuny Wants to Learn Swap

tag: *1900;逆序对,单调栈,双指针,线段树CodeForces-2138B Antiamuny Wants to Learn Swap tag: *1900;逆序对,单调栈,双指针,线段树对于长度为 \(m\) 的数组 \(b\),你可以进行以下两种操作:选择一个下标 \(…