资讯动态

FlatLaf IntelliJ Themes Pack 完整指南:在 Swing 应用中集成 JetBrains 生态的第三方主题

发布时间:2026/10/15 3:12:17 来源:尧图企业网站定制
桌面应用UI组件【免费下载链接】FlatLafFlatLaf - Swing Look and Feel (with Darcula/IntelliJ themes support)项目地址https://gitcode.com/gh_mirrors/fl/FlatLaf点击查看免费下载FlatLaf 的 IntelliJ Themes Packflatlaf-intellij-themes是一个官方附加组件它把 JetBrains Plugin Repository 中大量流行的开源第三方主题Arc、Dracula、Nord、One Dark、Material Theme UI Lite 等打包进一个 JAR并对外提供可直接调用的 Java 类。本文将以该模块的 README 为骨架结合仓库源码讲解如何引入依赖、通过setup()一行代码启用主题、如何借助FlatAllIJThemes.INFOS构建主题切换器并深入剖析这些主题类背后的加载与解析原理读完即可在自己的 Swing 应用中复刻 IntelliJ IDEA 风格的界面。一、模块定位它解决了什么问题FlatLaf 核心自带 FlatLightLaf.java、FlatDarkLaf.java、FlatIntelliJLaf.java、FlatDarculaLaf.java 四套内置外观视觉风格深受 IntelliJ IDEA 2019.2 的 IntelliJ/Darcula 主题影响。而IntelliJ Themes Pack则更进一步它把 JetBrains 插件生态中由第三方作者维护的.theme.json主题文件翻译成 FlatLaf 可以直接渲染的 Look and Feel让桌面应用一键获得与 JetBrains IDE 插件完全一致的配色方案。从源码结构看该模块的组织非常清晰flatlaf-intellij-themes/src/main/java/com/formdev/flatlaf/intellijthemes/29 个普通主题类每个主题一个FlatXxxIJTheme.javaflatlaf-intellij-themes/src/main/java/com/formdev/flatlaf/intellijthemes/materialthemeuilite/17 个 Material Theme UI Lite 系列主题类类名前缀FlatMTFlatAllIJThemes.java集中登记全部 46 个主题的元信息名称、类名、明暗标志Utils.java负责从 JAR 内读取.theme.json资源并构造IntelliJTheme对象。这些主题类全部由代码生成器自动产出每个文件头部都标注了Generated with com.formdev.flatlaf.demo.intellijthemes.IJThemesClassGenerator见 IJThemesClassGenerator.java因此结构高度一致维护成本极低。二、获取方式Maven / Gradle 依赖坐标官方 README 明确说明该模块的二进制制品发布在Maven Central。使用 Maven 或 Gradle 时在构建脚本中声明以下坐标即可项值groupIdcom.formdevartifactIdflatlaf-intellij-themesversion以 Maven Central 实际发布版本为准以仓库当前 gradle.properties 中flatlaf.releaseVersion 3.7.2作为版本参考Gradle 的依赖写法如下dependencies { implementation com.formdev:flatlaf:3.7.2 // 核心库 implementation com.formdev:flatlaf-intellij-themes:3.7.2 // 主题包 }Maven 写法dependency groupIdcom.formdev/groupId artifactIdflatlaf-intellij-themes/artifactId version3.7.2/version /dependency注意主题包运行期强依赖com.formdev:flatlaf核心库因此核心依赖也需要一并引入具体版本号请以 Maven Central 上对应 artifact 的最新发布版本为准不要机械照搬示例中的数字。三、快速上手一行setup()启用主题这是官方 README 给出的核心用法选定一个主题见下文完整清单调用它的静态setup()方法。例如启用 Arc - Orange 主题FlatArcOrangeIJTheme.setup();在真实应用中完整的最小示例是import com.formdev.flatlaf.intellijthemes.FlatArcOrangeIJTheme; public class Main { public static void main(String[] args) { // 必须在 Swing 组件创建之前调用 FlatArcOrangeIJTheme.setup(); javax.swing.SwingUtilities.invokeLater(() - { JFrame frame new JFrame(FlatLaf IntelliJ Theme Demo); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); frame.setVisible(true); }); } }以 FlatArcOrangeIJTheme.java 为样本每个主题类都遵循同一套模板包含四个关键成员public class FlatArcOrangeIJTheme extends IntelliJTheme.ThemeLaf { public static final String NAME Arc - Orange; // 主题显示名 // 1. 一键启用创建实例并交给 FlatLaf.setup() public static boolean setup() { try { return setup(new FlatArcOrangeIJTheme()); } catch (RuntimeException ex) { return false; } } // 2. 注册到 UIManager便于通过类名切换 public static void installLafInfo() { installLafInfo(NAME, FlatArcOrangeIJTheme.class); } // 3. 构造器从 JAR 资源加载 .theme.json public FlatArcOrangeIJTheme() { super(Utils.loadTheme(arc-theme-orange.theme.json)); } Override public String getName() { return NAME; } }关键点解读setup()返回boolean内部调用的是FlatLaf.setup(LookAndFeel)其实现见 FlatLaf.java本质是UIManager.setLookAndFeel()的包装失败时记录 severe 日志并返回falseinstallLafInfo()可选其底层调用UIManager.installLookAndFeel()见 FlatLaf.java调用后主题会出现在UIManager.getInstalledLookAndFeels()的列表中适合用类名字符串而非直接引用类做切换的场景主题文件是资源而非代码构造器通过Utils.loadTheme()从 classpath 读取 JSON主题数据全部在src/main/resources打包后位于 JAR 的/com/formdev/flatlaf/intellijthemes/themes/目录下Java 类只是薄封装。四、内置主题完整清单该模块内置的主题分为两组普通主题与 Material Theme UI Lite 主题。以下清单完整继承自官方 README类名即真实存在的源码文件。4.1 普通主题29 个位于包com.formdev.flatlaf.intellijthemes主题名称类名Arccom.formdev.flatlaf.intellijthemes.FlatArcIJThemeArc - Orangecom.formdev.flatlaf.intellijthemes.FlatArcOrangeIJThemeArc Darkcom.formdev.flatlaf.intellijthemes.FlatArcDarkIJThemeArc Dark - Orangecom.formdev.flatlaf.intellijthemes.FlatArcDarkOrangeIJThemeCarboncom.formdev.flatlaf.intellijthemes.FlatCarbonIJThemeCobalt 2com.formdev.flatlaf.intellijthemes.FlatCobalt2IJThemeCyan lightcom.formdev.flatlaf.intellijthemes.FlatCyanLightIJThemeDark Flatcom.formdev.flatlaf.intellijthemes.FlatDarkFlatIJThemeDark purplecom.formdev.flatlaf.intellijthemes.FlatDarkPurpleIJThemeDraculacom.formdev.flatlaf.intellijthemes.FlatDraculaIJThemeGradianto Dark Fuchsiacom.formdev.flatlaf.intellijthemes.FlatGradiantoDarkFuchsiaIJThemeGradianto Deep Oceancom.formdev.flatlaf.intellijthemes.FlatGradiantoDeepOceanIJThemeGradianto Midnight Bluecom.formdev.flatlaf.intellijthemes.FlatGradiantoMidnightBlueIJThemeGradianto Nature Greencom.formdev.flatlaf.intellijthemes.FlatGradiantoNatureGreenIJThemeGraycom.formdev.flatlaf.intellijthemes.FlatGrayIJThemeGruvbox Dark Hardcom.formdev.flatlaf.intellijthemes.FlatGruvboxDarkHardIJThemeHiberbee Darkcom.formdev.flatlaf.intellijthemes.FlatHiberbeeDarkIJThemeHigh Contrastcom.formdev.flatlaf.intellijthemes.FlatHighContrastIJThemeLight Flatcom.formdev.flatlaf.intellijthemes.FlatLightFlatIJThemeMaterial Design Darkcom.formdev.flatlaf.intellijthemes.FlatMaterialDesignDarkIJThemeMonocaicom.formdev.flatlaf.intellijthemes.FlatMonocaiIJThemeMonokai Procom.formdev.flatlaf.intellijthemes.FlatMonokaiProIJThemeNordcom.formdev.flatlaf.intellijthemes.FlatNordIJThemeOne Darkcom.formdev.flatlaf.intellijthemes.FlatOneDarkIJThemeSolarized Darkcom.formdev.flatlaf.intellijthemes.FlatSolarizedDarkIJThemeSolarized Lightcom.formdev.flatlaf.intellijthemes.FlatSolarizedLightIJThemeSpacegraycom.formdev.flatlaf.intellijthemes.FlatSpacegrayIJThemeVuesioncom.formdev.flatlaf.intellijthemes.FlatVuesionIJThemeXcode-Darkcom.formdev.flatlaf.intellijthemes.FlatXcodeDarkIJTheme4.2 Material Theme UI Lite17 个位于子包com.formdev.flatlaf.intellijthemes.materialthemeuilite类名前缀统一为FlatMT主题名称类名Arc Dark (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTArcDarkIJThemeAtom One Dark (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTAtomOneDarkIJThemeAtom One Light (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTAtomOneLightIJThemeDracula (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTDraculaIJThemeGitHub (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTGitHubIJThemeGitHub Dark (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTGitHubDarkIJThemeLight Owl (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTLightOwlIJThemeMaterial Darker (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMaterialDarkerIJThemeMaterial Deep Ocean (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMaterialDeepOceanIJThemeMaterial Lighter (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMaterialLighterIJThemeMaterial Oceanic (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMaterialOceanicIJThemeMaterial Palenight (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMaterialPalenightIJThemeMonokai Pro (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMonokaiProIJThemeMoonlight (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTMoonlightIJThemeNight Owl (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTNightOwlIJThemeSolarized Dark (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTSolarizedDarkIJThemeSolarized Light (Material)com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTSolarizedLightIJThemeMaterial 系列的主题文件存放于资源目录themes/material-theme-ui-lite/下这一点可以从 materialthemeuilite/Utils.java 的资源路径中确认。以 FlatMTArcDarkIJTheme.java 为例它加载的资源是Arc Dark.theme.json显示名为Arc Dark (Material)——即命名冲突时通过(Material)后缀区分。五、源码级原理剖析5.1 资源加载Utils.loadTheme()普通主题的 Utils.java 实现非常精简static IntelliJTheme loadTheme(String name) { try { return new IntelliJTheme(Utils.class.getResourceAsStream( /com/formdev/flatlaf/intellijthemes/themes/ name)); } catch (IOException ex) { String msg FlatLaf: Failed to load IntelliJ theme name ; LoggingFacade.INSTANCE.logSevere(msg, ex); throw new RuntimeException(msg, ex); } }它通过 classpath 资源路径定位.theme.json文件加载失败时先通过 LoggingFacade 记录 severe 日志再抛出RuntimeException——这正是主题类setup()中catch (RuntimeException ex)捕获并返回false的来源。5.2 JSON 解析与属性映射IntelliJTheme核心解析逻辑位于 IntelliJTheme.java。构造器约 L120-L137把.theme.json用 UTF-8 读取并交给com.formdev.flatlaf.json.Json.parse()解析然后抽取五个顶层节点name主题名称dark布尔字符串决定明暗主题author作者信息colors命名字典映射到 FlatLaf 的命名颜色xxx变量ui组件级 UI 键值逐条转换为 Swing UI 属性icons图标配色信息如ColorPalette。随后applyProperties()约 L139 起完成大量翻译工作例如写入Component.isIntelliJTheme true标记根据明暗主题设置按钮阴影宽度Button.shadowWidth暗色为 2、亮色为 1把accentBaseColor映射到ColorPalette.accent、ColorPalette.accentColor、ProgressBar.foreground、*.selectionBackground等多个 FlatLaf 键见 L162-L166以兼容不同主题作者的命名习惯将TextField.background扩散到EditorPane、FormattedTextField、PasswordField、TextArea、TextPane等文本组件弥补 IntelliJ 主题只定义部分组件的空缺处理*.前缀的通配属性替换L248-L263对Button的 start/end 渐变背景做fixStartEnd()修正还原 FlatLaf 的按钮渲染习惯。这些适配逻辑正是第三方 IntelliJ 主题能无缝工作在 Swing 上的关键——它并不是简单地套用颜色而是把 IntelliJ 平台的属性语义映射到 Swing 组件属性语义上。5.3 明暗判定与默认值来源IntelliJTheme.ThemeLaf每个主题类都继承IntelliJTheme.ThemeLaf定义于 IntelliJTheme.java它本身继承FlatLafpublic static class ThemeLaf extends FlatLaf { Override public String getName() { return theme.name; } Override public boolean isDark() { return theme.dark; } Override void applyAdditionalProperties(Properties properties) { theme.applyProperties(properties); } Override protected ArrayListClass? getLafClassesForDefaultsLoading() { ArrayListClass? lafClasses UIDefaultsLoader.getLafClassesForDefaultsLoading(getClass()); lafClasses.add(1, theme.dark ? FlatDarkLaf.class : FlatLightLaf.class); lafClasses.add(2, theme.dark ? FlatDarculaLaf.class : FlatIntelliJLaf.class); return lafClasses; } }这段代码揭示了两个重要事实isDark()直接由 JSON 中的dark字段决定因此主题列表、图标渲染、系统托盘明暗适配等都能自动跟随默认值加载是分层叠加的主题自身属性优先随后回落到FlatDarkLaf/FlatLightLaf再回落到FlatDarculaLaf/FlatIntelliJLaf最后是 FlatLaf 基础默认值。这保证了主题 JSON 未覆盖到的组件也能获得风格统一的兜底外观。5.4 元信息清单FlatAllIJThemes.INFOSFlatAllIJThemes.java 用静态数组集中登记全部主题public static final FlatIJLookAndFeelInfo[] INFOS { new FlatIJLookAndFeelInfo(Arc, com.formdev.flatlaf.intellijthemes.FlatArcIJTheme, false), new FlatIJLookAndFeelInfo(Arc - Orange, com.formdev.flatlaf.intellijthemes.FlatArcOrangeIJTheme, false), new FlatIJLookAndFeelInfo(Arc Dark, com.formdev.flatlaf.intellijthemes.FlatArcDarkIJTheme, true), // ... 共 46 项 };FlatIJLookAndFeelInfo继承自javax.swing.UIManager.LookAndFeelInfo第三个参数dark用于标记明暗属性。该数组同样由 IJThemesClassGenerator.java 自动生成与主题类一一对应任何新增/移除主题都会同步反映在清单中。基于它应用可以轻松构建主题选择下拉框。六、进阶实战6.1 用FlatAllIJThemes.INFOS构建主题切换器不需要为每个主题手写分支遍历INFOS即可生成候选列表import com.formdev.flatlaf.IntelliJTheme; import com.formdev.flatlaf.intellijthemes.FlatAllIJThemes; import javax.swing.*; JComboBoxFlatAllIJThemes.FlatIJLookAndFeelInfo combo new JComboBox(); for (FlatAllIJThemes.FlatIJLookAndFeelInfo info : FlatAllIJThemes.INFOS) combo.addItem(info); combo.addActionListener(e - { FlatAllIJThemes.FlatIJLookAndFeelInfo info (FlatAllIJThemes.FlatIJLookAndFeelInfo) combo.getSelectedItem(); try { // 通过类名字符串切换 Look and Feel UIManager.setLookAndFeel(info.getClassName()); } catch (Exception ex) { ex.printStackTrace(); } });配合FlatAnimatedLafChange.showSnapshot()与hideSnapshotWithAnimation()见 FlatAnimatedLafChange.java可实现丝滑的明暗主题过渡动画。仓库的 FlatLaf Demo 正是这样实现的主题列表、明暗筛选all/light/dark与插件/源码跳转按钮都在 IJThemesPanel.java 中切换后调用FlatLaf.updateUI()统一刷新所有已创建组件。6.2 在 FlatLaf Demo 中体验全部主题官方 README 推荐直接使用 FlatLaf Demo 试用这些主题。Demo 的 FlatLafDemo.java 提供完整的主题浏览界面支持按明暗过滤主题列表一键跳转到主题的插件主页与源码仓库加载当前工作目录下的自定义.theme.json/.properties主题文件对应 IJThemesManager.java 中的loadThemesFromDirectory()它扫描工作目录下以.theme.json或.properties结尾的文件。6.3 加载自定义 IntelliJ 主题文件该模块内置主题是静态打包的如果你从 JetBrains 插件市场拿到了新的.theme.json不必改代码可以用核心库的IntelliJThemeAPI 动态加载import com.formdev.flatlaf.IntelliJTheme; import java.io.FileInputStream; IntelliJTheme.setup(new FileInputStream(my-theme.theme.json));IntelliJTheme.setup(InputStream)见 IntelliJTheme.java会解析流、创建ThemeLaf实例并完成安装输入流会自动关闭。也可以先IntelliJTheme.createLaf(in)拿到FlatLaf实例再自行决定FlatLaf.setup(laf)或UIManager.setLookAndFeel(laf)。6.4 运行期安装多个主题供用户挑选调用每个主题类的installLafInfo()可把多个主题注册进UIManager之后就能用字符串类名在任意时刻切换FlatArcIJTheme.installLafInfo(); FlatDraculaIJTheme.installLafInfo(); FlatNordIJTheme.installLafInfo(); UIManager.setLookAndFeel(com.formdev.flatlaf.intellijthemes.FlatDraculaIJTheme);七、Java 模块化JPMS支持该模块声明了标准 Java 模块com.formdev.flatlaf.intellijthemes见 module-info.javamodule com.formdev.flatlaf.intellijthemes { requires java.desktop; requires com.formdev.flatlaf; exports com.formdev.flatlaf.intellijthemes; exports com.formdev.flatlaf.intellijthemes.materialthemeuilite; }在模块化应用如flatlaf-testing-modular-app中只需在module-info.java里添加requires com.formdev.flatlaf.intellijthemes;即可使用两个包均已导出普通类路径classpath使用则无需任何额外配置。八、使用建议与注意事项在组件创建之前调用setup()Look and Feel 必须在任何 Swing 组件实例化之前安装否则已创建组件的 UI 不会自动更新需要手动SwingUtilities.updateComponentTreeUI()。setup()返回false时不要静默忽略通常是主题资源缺失或 JSON 解析失败可结合LoggingFacade输出的 severe 日志排查请确认 JAR 完整打入依赖且资源目录未被排除。明暗属性已自动处理ThemeLaf.isDark()来自 JSON 的dark字段如需在应用内做主题感知逻辑如图标切换直接判断((FlatLaf)UIManager.getLookAndFeel()).isDark()即可。主题文件资源路径是固定的普通主题在/com/formdev/flatlaf/intellijthemes/themes/Material 系列在themes/material-theme-ui-lite/子目录不要自行移动或重命名 JAR 内资源。与核心库版本保持同步主题包与核心库通常同版本发布混用跨版本依赖可能导致属性映射差异建议二者使用相同版本。九、小结FlatLaf IntelliJ Themes Pack 以极低的使用成本一个依赖 一行setup()把 JetBrains 生态中最受欢迎的第三方主题引入 Swing 应用。其底层由 IntelliJTheme 负责.theme.json的解析与属性映射由模板化生成的 46 个主题类提供统一 API由 FlatAllIJThemes 提供可枚举的元信息清单——理解这三层结构你就能在应用中轻松实现主题选择、动态切换乃至自定义 IntelliJ 主题加载让桌面软件拥有 JetBrains 级别的现代观感。赞分享桌面应用UI组件【免费下载链接】FlatLafFlatLaf - Swing Look and Feel (with Darcula/IntelliJ themes support)项目地址https://gitcode.com/gh_mirrors/fl/FlatLaf点击查看免费下载相关推荐FlatLaf 字体包使用指南在 Swing 应用中集成 JetBrains Mono 等宽字体FlatLaf 字体包使用指南在 Swing 应用中集成 JetBrains Mono 等宽字体 导读 JetBrains Mono 是 JetBrains桌面应用UI组件FlatLaf与IntelliJ平台主题的完美集成打造现代化Java Swing应用的终极指南FlatLaf与IntelliJ平台主题的完美集成打造现代化Java Swing应用的终极指南 FlatLaf是一款功能强大的Swing外观组件库它能够帮助桌面应用UI组件FlatLaf Fonts 字体包使用指南在 Swing 应用中集成 Inter、JetBrains Mono、Roboto 与 Roboto MonoFlatLaf Fonts 字体包使用指南在 Swing 应用中集成 Inter、JetBrains Mono、Roboto 与 Roboto Mono 本篇桌面应用UI组件上一篇AICoverGen终极指南10分钟掌握AI翻唱制作让任何声音为你唱歌下一篇3步终极性能释放Windows Defender完全移除与系统优化指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑