JavaFX 与 Java Swing 桌面应用开发实战指南

JavaFX 与 Java Swing 桌面应用开发实战指南

Java桌面应用开发:JavaFX模块化与响应式实战方案一、技术选型对比

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 中明确声明依赖:

代码语言: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 变量实现自适应界面:

代码语言: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.3JavaFX 与最新 JDBC API 集成,支持自动资源管理:

代码语言:java复制// BookRepository.java

public List 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 冻结:

代码语言:java复制// BookService.java

public void loadBooksAsync(Consumer> callback) {

Task> task = new Task<>() {

@Override

protected List 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 自定义表格渲染创建可排序、可筛选的表格视图:

代码语言:java复制// BookTableView.java

public class BookTableView extends TableView {

public BookTableView() {

TableColumn idCol = new TableColumn<>("ID");

idCol.setCellValueFactory(new PropertyValueFactory<>("id"));

TableColumn titleCol = new TableColumn<>("书名");

titleCol.setCellValueFactory(new PropertyValueFactory<>("title"));

TableColumn authorCol = new TableColumn<>("作者");

authorCol.setCellValueFactory(new PropertyValueFactory<>("author"));

getColumns().addAll(idCol, titleCol, authorCol);

setItems(FXCollections.observableArrayList());

setPrefHeight(400);

}

}3.2 图表可视化集成 JavaFX Charts 实现数据可视化:

代码语言:java复制// SalesChart.java

public class SalesChart extends LineChart {

public SalesChart() {

super(new NumberAxis("月份"), new NumberAxis("销量"));

setTitle("图书销售趋势");

XYChart.Series 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实现视图模型层,支持数据绑定:

代码语言:java复制// BookViewModel.java

public class BookViewModel {

private final ObservableList 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)

)

);

}

// Getters

public ObservableList getBooks() { return books; }

public StringProperty searchTextProperty() { return searchText; }

}4.2 FXML控制器集成在控制器中注入视图模型:

代码语言:java复制// BookController.java

public class BookController {

@FXML private BookTableView bookTable;

@FXML private TextField searchField;

@FXML private Button addButton;

private BookViewModel viewModel;

@FXML

private 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 运行环境:

代码语言:bash复制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-pages5.2 打包为原生安装包使用 jpackage 创建平台特定安装程序:

代码语言:bash复制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 应用结构示例:

代码语言:txt复制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+ 的新特性,包括模块化系统、响应式布局和异步处理,同时遵循了现代软件开发最佳实践,实现了关注点分离和可测试性。

JavaFX,Java Swing, 桌面应用开发,实战指南,Java 开发,UI 框架,跨平台开发,图形界面,事件处理,布局管理,控件开发,数据绑定,动画效果,性能优化,Java 桌面应用

相关文章

“深圳”地名的由来
BET3365手机下载

“深圳”地名的由来

🌱 09-03 💬 731
卡牌皮肤特效聚焦:哪款皮肤独具特效魅力?
365bet品牌中文网

卡牌皮肤特效聚焦:哪款皮肤独具特效魅力?

🌱 09-05 💬 535
excel怎么整行多行上下移动
BET3365手机下载

excel怎么整行多行上下移动

🌱 08-31 💬 942