# FableUI
**Repository Path**: qsyan/FableUI
## Basic Information
- **Project Name**: FableUI
- **Description**: FableUI
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: v1
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2026-08-12
- **Last Updated**: 2026-10-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# FableUI
基于 **Swing + JNA** 的 Windows 桌面 UI 框架:**保留系统窗口框架**(非 `setUndecorated`),由 Swing 自绘标题栏接管非客户区交互,并提供一套 **Element Plus 风格**的控件与组件库。
一句话概括:**照常写标准 Swing,就能得到现代 IDEA 风格的窗口与 Element Plus 风格的界面。**
> **版本号:`0.0.3`** · 变更见 [CHANGELOG.md](CHANGELOG.md)

## 特性
- **零侵入装配**:`FableUI.setup()` 注册 LAF 钩子,之后任意 `JFrame` / `JDialog` 构造即自动获得自绘标题栏、圆角窗口与原生窗口能力;业务内容继续用原生 `frame.setContentPane(content)` 注入,无需继承任何基类。
- **原生窗口能力**(Windows):标题栏拖动、双击最大化、8 向边缘缩放、拖顶最大化、左右贴靠分屏、Snap Layout 悬停入口、DWM 圆角;Swing 侧仅作为非 Windows 平台的回退路径。
- **Element Plus 风格控件**:按钮(5 种语义 + plain / round / circle / text / link / loading)、输入框、下拉框、复选框(含半选)、单选框、开关、滑块、进度条、细滚动条、选项卡、表格、树、菜单体系。
- **自研组件**:`FTable`(表头排序 / 48px 选择列 / 斑马纹 / 行分隔线开关 / 表头列分隔竖线开关 / 空数据占位)、`FTree`(系统文件图标 / 真实目录树 / 整行悬停与选中高亮,节点自身无方框无额外底色)、`FLoading`(加载圆环 + `JLayer` 遮罩)、`FPathField` / `FFileDialogs` / `FFileChooser`(路径与文件选择:`FFileDialogs` **原生优先**、原生不可用时自动回退;`FFileChooser` 自绘窗口含「返回上一级」「新建文件夹」与右键菜单「复制 / 剪切 / 粘贴 / 新建 / 重命名 / 删除」,重命名为**列表内就地编辑**,F2 触发)、`FTag` / `FBadge` / `FAlert` / `FCard` / `FEmpty` / `FResult` / `FSkeleton`,以及分隔条 `FSplitter` + `FSplitterPanel`(横向 / 纵向分栏,拖拽分隔条调整面板尺寸,支持 `min` / `max` 与 `resizable`,对齐 Element Plus `el-splitter`)等。
- **Element Plus 布局模型**(`com.fable.layout`):`FRow` / `FCol` 24 栅格(`gutter` 列间距、`offset` 偏移、6 种分布、4 种垂直对齐、按容器宽度的断点响应式、自动换行),以及单轴堆叠容器 `FStack`(纵向 / 横向、交叉轴对齐、`grow` 吸收剩余空间、`wrap` 换行)—— 替代 `BorderLayout` / `GridLayout` / `BoxLayout` / `FlowLayout` 的各种样板写法(`setMaximumSize(getPreferredSize())`、`createVerticalStrut`、`createVerticalGlue`、`createHorizontalStrut` 等)。**框架自身与 demo 的界面布局均采用该模型**;旧布局名称仍会出现在迁移对照文档和源码注释中,业务容器也可继续使用标准 Swing 布局。
- **明暗双主题 + CSS 主题变量**:`ThemeMode.DARK` / `LIGHT`,运行期 `FableUI.applyThemeMode(...)` 一键切换并刷新所有已打开窗口;配色定义在 `theme.css`(CSS 子集:`var()` 引用、分层覆盖、选择器列表,对齐 Element Plus `--el-*` 的命名方式),因此**自定义主题只需写差异** —— `FableTheme.deriveFrom(基底, 资源, id)` + `FableUI.applyTheme(...)`。
- **可定制标题栏**:左 / 中 / 右三个插槽可放任意业务控件,空白区域仍保持原生拖动能力。
## 环境要求
| 项 | 要求 |
| --- | --- |
| JDK | 21 及以上 |
| 构建 | Maven 3.x |
| 依赖 | JNA 5.19.1(`jna` + `jna-platform`) |
| 平台 | Windows 10/11 可启用完整原生能力;其它平台(含 Linux / macOS)自动回退到 Swing 行为,不抛异常。文件 / 文件夹选择:Windows 走**现代通用项对话框**(`IFileDialog`,文件与文件夹都支持,带导航窗格 / 地址栏 / 搜索框),macOS 的文件选择走原生 `NSOpenPanel`,其余情况回退自绘窗口。**不支持 Windows 7 / 8.1**:JDK 21 的最低系统要求是 Windows 10(JDK 17 起的 Windows 版二进制在 Win7 上无法运行),而本项目语言级别为 21 |
| Maven 坐标 | `io.github.yannexus:fableui` |
| 版本 | `0.0.3` |
| 许可证 | Apache License 2.0 |
## 快速开始
**1. 安装到本地仓库并引入**
```bash
cd FableUI
mvn -o clean install -DskipTests
```
```xml
io.github.yannexus
fableui
0.0.3
```
> Maven 坐标 `io.github.yannexus:fableui`(2026-09-19 由 `com.fable:FableUI:1.0-SNAPSHOT` 变更);构件版本以依赖片段为准,**版本号为 `0.0.3`**(变更明细见 [CHANGELOG.md](CHANGELOG.md))。
> `pom.xml` 已配置 `maven-source-plugin` / `maven-javadoc-plugin` / `maven-gpg-plugin` 与
> `central-publishing-maven-plugin`,`mvn verify` 会一并产出 `sources` / `javadoc` 与签名构件。
**2. 最小示例**
```java
import com.fable.components.FButtonUI;
import com.fable.core.FableUI;
import com.fable.layout.FStack;
import com.fable.layout.FStackAlignment;
import com.fable.theme.ThemeMode;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
/** 使用框架布局创建最小桌面窗口。 */
public class HelloFable {
/** 在 Swing 事件派发线程中安装主题并创建界面。 */
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
FableUI.setup(ThemeMode.LIGHT); // 必须在任何窗口创建之前调用一次
// 标准 Swing 按钮通过客户端属性使用主色外观。
JButton primary = new JButton("主色按钮");
primary.putClientProperty(FButtonUI.CLIENT_PROPERTY_TYPE,
FButtonUI.FButtonType.PRIMARY);
// 纵向内容区:文字吸收剩余高度,按钮按内容宽度靠左。
FStack content = new FStack(12);
content.addGrowing(new JLabel("你好,FableUI"));
content.add(primary, FStackAlignment.START);
// 创建标准窗口,框架自动装配标题栏。
JFrame frame = new JFrame(); // 构造即自动装配装饰层
frame.setContentPane(content); // 原生 API,无需包装
frame.setTitle("Hello FableUI");
frame.setSize(640, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
```
运行后即得到一个带自绘标题栏的圆角窗口:标题栏可原生拖动、双击最大化、边缘 8 向缩放,按钮为 Element Plus 主色填充样式。
**3. 运行内置演示**(20 个组件分区,覆盖全部控件)
```powershell
mvn -o -q compile
mvn -o dependency:build-classpath -Dmdep.outputFile=target/cp.txt
$cp = "target/classes;" + (Get-Content target/cp.txt -Raw).Trim()
java -cp $cp FableDemo
```
## 文档
| 文档 | 内容 |
| --- | --- |
| [docs/LAYOUT.md](docs/LAYOUT.md) | **布局指南(推荐新手先读)**:两条轴的心智模型、`FStack` / `FRow` / `FCol` 用法、固定宽与撑满的做法、响应式断点、常用配方、旧布局迁移对照、常见坑与 API 速查 |
| [docs/USAGE.md](docs/USAGE.md) | 使用手册:引入方式、快速上手、窗口与标题栏、主题与尺寸体系、全部组件用法与示例、场景配方、能力边界、打包分发与排错 FAQ |
| [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | 开发文档:包职责、核心对象职责、Win32 消息处理、状态流转、高风险修改清单、问题排查记录、验证清单与累计变更记录 |
| [docs/HANDOFF.md](docs/HANDOFF.md) | 交接报告:当前状态、已修复问题、踩坑记录、名称变更映射表 |
## 构建与测试
```bash
mvn -q -DskipTests package # 打包为 target/fableui-.jar(不含依赖)
mvn clean test # 执行当前源码的全量测试
mvn -q verify # 额外产出 sources / javadoc 与 GPG 签名构件
```
运行时 classpath 需包含 JNA 两个 jar(`jna` 与 `jna-platform`)。
最近的全量验证记录见 [交接报告](docs/HANDOFF.md):2026-10-09 记录为 39 个测试类、303 个用例,其中 1 个 COM 槽位自检用例跳过(另有 2 个 `FFileActionsTest` 错误为沙箱环境 junction 清理限制、非回归)。该记录是当时的验证结果,当前结果以重新运行后的 Surefire 报告为准。
## 许可证
本项目采用 [Apache License, Version 2.0](LICENSE)(全文见仓库根目录的 [`LICENSE`](LICENSE))。