# FxmlKit **Repository Path**: zytabc/FxmlKit ## Basic Information - **Project Name**: FxmlKit - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-19 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FxmlKit [![JFXCentral](https://img.shields.io/badge/Find_me_on-JFXCentral-blue?logo=googlechrome&logoColor=white)](https://www.jfx-central.com/libraries/fxmlkit) [![Maven Central](https://img.shields.io/maven-central/v/com.dlsc.fxmlkit/fxmlkit?color=brightgreen)](https://search.maven.org/search?q=g:com.dlsc.fxmlkit%20AND%20a:fxmlkit) [![Java Version](https://img.shields.io/badge/Java_Version-11+-ff69b4)](https://github.com/openjdk/jdk) [![JavaFX Version](https://img.shields.io/badge/JavaFX_Version-11+-brightgreen)](https://github.com/openjdk/jfx) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) **FxmlKit = 自动 FXML 加载 + 热更新 + 可选依赖注入** ```java // 开发时启用 FXML/CSS 热更新 FxmlKit.enableDevelopmentMode(); // 零配置 - 自动加载 FXML new MainView(); // 带依赖注入 new MainView(diAdapter); ``` 现代化的 JavaFX FXML 框架,消除样板代码,提供 FXML/CSS 热更新,以及可选的渐进式依赖注入支持。 [English](README.md) | [示例项目](fxmlkit-samples) --- ## 目录 - [为什么选择 FxmlKit](#为什么选择-fxmlkit) - [核心特性](#核心特性) - [致谢(Acknowledgments)](#致谢acknowledgments) - [快速开始](#快速开始) - [使用方式](#使用方式) - [热更新](#热更新) - [核心概念](#核心概念) - [注解](#注解) - [常见问题](#常见问题) - [示例项目](#示例项目) --- ## 为什么选择 FxmlKit ### 痛点一:UI 开发时没有热更新 传统 JavaFX 开发中,每次修改 FXML 或 CSS 文件都需要重启应用才能看到效果。这大大降低了 UI 开发效率。 **FxmlKit 方案:** ```java public class MyApp extends Application { @Override public void start(Stage stage) { FxmlKit.enableDevelopmentMode(); // ✅ 一行代码启用热更新 stage.setScene(new Scene(new MainView())); stage.show(); } } ``` 现在编辑 `.fxml` 或 `.css` 文件,保存后即刻生效 — 无需重启! --- ### 痛点二:原生 FXML 加载需要大量样板代码 每个视图都要重复:获取 URL、配置 FXMLLoader、处理异常、加载样式表…… **FxmlKit 方案:** ```java // ✅ 一行代码,自动处理所有事情 public class LoginView extends FxmlView { } ``` 自动完成 FXML 解析、样式表附加、控制器创建和异常处理。 --- ### 痛点三:FXML 自定义组件几乎无法接收依赖注入 传统方式下,FXML 中的自定义组件由 FXMLLoader 直接实例化,无法访问 DI 容器。 **FxmlKit 方案:** 控制器自动注入: ```java public class LoginController { @Inject private UserService userService; @PostInject // 自动调用 private void afterInject() { // 依赖已就绪 } } ``` FXML 节点也能自动注入: ```java @FxmlObject // 一个注解搞定 public class StatusCard extends VBox { @Inject private StatusService statusService; @PostInject private void afterInject() { updateStatus(); } } ``` 在 FXML 中直接使用: ```xml ``` **重点:依赖注入是可选的!** 如果你不需要 DI,FxmlKit 仍然能消除 FXML 加载的样板代码。 --- ## 核心特性 - **零配置** — 开箱即用,无需任何设置 - **约定优于配置** — 自动发现 FXML 和样式表文件 - **热更新** — 开发时 FXML 和 CSS 修改即刻生效 - **fx:include 支持** — 完整的嵌套 FXML 热更新(包括动态添加/删除的 include) - **可选依赖注入** — 不需要 DI 框架也能使用,需要时可以添加 - **自动样式表** — 自动附加 `.bss` 和 `.css` 文件 - **JPro 就绪** — 支持多用户 Web 应用的数据隔离(每个用户会话独立 DI 容器,确保数据安全) - **高性能** — 智能缓存和性能优化 **与原生 JavaFX 对比:** | 功能 | JavaFX 原生 | FxmlKit | |------|------------|---------| | 热更新(FXML + CSS) | ❌ 需要重启应用 | ✅ 即刻刷新 | | fx:include 热更新 | ❌ 无 | ✅ 完整支持(子文件变化时父视图自动刷新) | | User Agent Stylesheet 热更新 | ❌ 无 | ✅ 全部级别(Application/Scene/SubScene/自定义控件) | | FXML 自动加载 | ❌ 手动编写加载代码 | ✅ 零配置自动加载 | | 样式表自动附加 | ❌ 手动代码附加 | ✅ FxmlView 自动附加 | | 控制器依赖注入 | ⚠️ 需手动配置工厂 | ✅ 自动注入 | | **FXML 节点注入** | ❌ **几乎不可能** | ✅ **@FxmlObject 一行搞定** | | 多层 fx:include 支持 | ⚠️ 部分支持 | ✅ 完整支持(含注入、样式) | | @PostInject 生命周期 | ❌ 无 | ✅ 支持 | | JPro 多用户隔离 | ❌ 需手动实现 | ✅ 原生支持 | --- ## 致谢(Acknowledgments) - **[afterburner.fx](https://github.com/AdamBien/afterburner.fx)** — 启发了我们的约定优于配置理念(按类名自动解析 FXML/CSS)。我们在此基础上扩展了 FXML 节点注入、多层嵌套支持和 JPro 多用户隔离。 - **[CSSFX](https://github.com/McFoggy/cssfx)** — 启发了我们的 CSS 热重载方案(file:// URI 替换)。我们的实现采用了共享 WatchService、防抖刷新和基于 WeakReference 的惰性清理。 --- ## 快速开始 ### 依赖要求 - **Java:** 11 或更高版本 - **JavaFX:** 11 或更高版本(推荐 17+) #### 热更新性能说明 FxmlKit 使用 Java 内置的 `WatchService` 实现 FXML/CSS 热更新。该服务在不同操作系统上的性能表现存在差异: | 操作系统 | Java 版本 | 文件变更检测延迟 | 说明 | |---------|----------|----------------|------| | Windows | 11+ | 几乎瞬间 | 原生文件系统事件 | | Linux | 11+ | 几乎瞬间 | 原生文件系统事件 | | macOS | 11+ | 约 2 秒 | FxmlKit 已优化 | ### 安装 **Maven:** ```xml com.dlsc.fxmlkit fxmlkit 1.5.0 ``` **Gradle:** ```gradle implementation 'com.dlsc.fxmlkit:fxmlkit:1.5.0' ``` **如果需要使用 Guice 来进行依赖注入:** 直接依赖 `fxmlkit-guice` 即可(已包含核心模块) **Maven:** ```xml com.dlsc.fxmlkit fxmlkit-guice 1.5.0 com.google.inject guice 7.0.0 ``` **Gradle:** ```gradle implementation 'com.dlsc.fxmlkit:fxmlkit-guice:1.5.0' implementation 'com.google.inject:guice:7.0.0' ``` **如果需要使用其他 DI 框架:** 可以继续使用 `fxmlkit` 核心模块,然后实现 `DiAdapter` 接口或继承 `BaseDiAdapter` 类来适配你的 DI 框架。同样地,即使使用 Guice,你也可以选择不依赖 `fxmlkit-guice` 模块,而是自己实现一个 `GuiceDiAdapter`(参考 `fxmlkit-guice` 的源码,实现非常简单)。 --- ### 创建你的第一个视图 **1. 创建 FXML 文件** `src/main/resources/com/example/HelloView.fxml`: ```xml