介绍
Swing默认主题太丑了,FlatLaf 是目前最受欢迎的 Swing 增强库之一,主要专注于为 Swing 应用提供现代化的 UI 主题和外观增强,同时对部分核心组件进行了功能优化。它的设计目标是解决原生 Swing 界面老旧、高 DPI 适配差等问题,同时保持对原生 Swing API 的兼容性。
FlatLaf 完全开源免费(Apache License 2.0),适合所有希望优化 Swing 界面的项目。
官网:
https://www.formdev.com/flatlaf/
FlatLaf 的核心特点
现代化主题风格
提供多种预设主题,包括:- 浅色主题(
FlatLightLaf)、深色主题(FlatDarkLaf) - 模仿 IntelliJ IDEA 的
FlatIntelliJLaf - 模仿 macOS 的
FlatMacLaf、模仿 Windows 11 的FlatWindows11Laf等
所有主题均采用扁平化设计,视觉简洁且符合现代审美。
- 浅色主题(
高 DPI 支持
自动适配高分辨率屏幕,解决原生 Swing 组件在高分屏下模糊的问题,确保文字、图标清晰显示。零侵入性集成
无需修改现有 Swing 代码,只需在应用启动时调用一行代码即可切换主题,完全兼容原生 Swing 组件(JLabel、JButton、JTable等)。丰富的自定义选项
支持修改颜色、字体、边框圆角、组件大小等细节,例如:- 调整按钮圆角半径、 hover 效果颜色
- 自定义表格行高、选中行背景色
- 更换全局字体(支持系统默认字体)
性能优化
相比其他主题库(如 Substance),FlatLaf 体积更小(约 500KB),渲染性能更优,不会明显增加应用启动时间。活跃的更新维护
持续更新以适配新系统(如 Windows 11、macOS Ventura)和 Java 版本,社区支持活跃。
FlatLaf 的增强组件
FlatLaf 本身不提供全新的组件类型,而是优化原生 Swing 组件的外观和行为,同时提供少量扩展工具类。主要增强点包括:
基础组件美化
- 按钮(
JButton):支持圆角、悬停/点击动画、图标与文字对齐优化 - 文本框(
JTextField):边框样式优化、焦点状态高亮、placeholder 提示文本(通过FlatTextField扩展) - 复选框(
JCheckBox)、单选框(JRadioButton):更现代的勾选样式,支持自定义图标 - 下拉框(
JComboBox):展开动画、选项高亮效果优化
- 按钮(
增强的文件选择器
对原生JFileChooser进行样式重构,使其外观更接近现代操作系统的文件选择器,支持:- 更清晰的文件图标
- 路径导航栏优化
- 深色模式下的文件列表对比度调整
表格与树组件优化
JTable:行高自适应、选中行背景色与主题融合、网格线样式优化JTree:节点展开/折叠动画、连接线样式美化
自定义组件工具类
FlatClientProperties:通过客户端属性快速配置组件样式(如设置按钮圆角:button.putClientProperty( FlatClientProperties.BUTTON_TYPE, FlatClientProperties.BUTTON_TYPE_ROUND ))FlatUIUtils:提供主题颜色获取、高 DPI 计算等工具方法FlatLafProperties:全局配置主题参数(如是否启用动画、字体大小等)
使用示例
依赖
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>3.6.1</version>
</dependency>
代码
只需在应用启动时添加一行代码即可启用 FlatLaf:
import com.formdev.flatlaf.FlatLightLaf;
import javax.swing.*;
public class FlatLafDemo {
public static void main(String[] args) {
// 启用 FlatLaf 浅色主题
FlatLightLaf.setup();
// 后续创建的所有 Swing 组件都会自动应用主题
JFrame frame = new JFrame("FlatLaf 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JButton("现代风格按钮"));
frame.pack();
frame.setVisible(true);
}
}
总结
FlatLaf 的核心价值在于用最低的成本提升 Swing 应用的视觉体验,它不改变原生 Swing 的组件结构,却能让界面从“传统风格”升级为“现代扁平化风格”。如果需要增强组件的功能(如更强大的表格、文件选择器),可以将 FlatLaf 与 SwingX 等功能型库结合使用(两者兼容良好)。