You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK11及以上版本实现瑞典语JFileChooser的方法及相关疑问

JFileChooser瑞典语本地化(JDK11+适配方案)

核心问题解答

1. JFileChooser的UI字符串来源:你的ResourceBundle假设是对的

Swing组件的本地化文本确实来自ResourceBundle,JFileChooser的默认字符串存放在对应LookAndFeel的资源包中(比如Basic风格对应com.sun.swing.internal.plaf.basic.resources.basic),不同Locale会加载对应的语言版本资源文件(如瑞典语的basic_sv.properties)。

2. JDK11后Locale默认值设置失效的原因

JDK11引入模块化设计后,Swing的UI资源加载逻辑发生了关键变化:

  • 早期JDK中,全局默认Locale(Locale.setDefault(new Locale("sv", "SE")))会让所有Swing组件自动匹配对应语言的资源包;
  • JDK11+中,java.desktop模块封装了内部资源包,应用程序无法直接访问,且组件加载资源时不再完全依赖全局Locale,而是优先使用组件自身Locale或系统UI的Locale设置。

3. UIManager修改UI字符串的原理与查找方式

字符串查找逻辑

Swing组件获取文本时,会通过UIManager.getString(key, locale)按以下顺序查找:

  • 优先读取UIManager中手动put的键值对;
  • 若未找到,再去对应LookAndFeel的ResourceBundle中匹配当前Locale的字符串;
  • 最后找不到则使用默认英文文本。

UIManager.put的原理

UIManager.put(Object key, Object value)是直接在UI管理器的全局缓存中插入自定义值,后续组件查找对应key时会直接返回这个值,跳过资源包的查找流程。比如修改"打开"按钮文本:

UIManager.put("FileChooser.openButtonText", "Öppna");

4. 可行解决方案

方案一:UIManager手动覆盖单个字符串

适合仅修改少量文本的场景,先找到JFileChooser的UI键名:

  • 查看对应LookAndFeel的语言资源文件(比如Basic风格的basic_sv.properties);
  • 调用UIManager.getDefaults().keys()遍历所有UI键,筛选包含"FileChooser"的条目。

示例代码:

// 覆盖瑞典语常用文本
UIManager.put("FileChooser.openButtonText", "Öppna");
UIManager.put("FileChooser.saveButtonText", "Spara");
UIManager.put("FileChooser.cancelButtonText", "Avbryt");
UIManager.put("FileChooser.fileNameLabelText", "Filnamn:");
UIManager.put("FileChooser.filesOfTypeLabelText", "Filtyper:");
// 按需添加更多键值对

方案二:自定义ResourceBundle替换默认逻辑

适合全量本地化所有文本的场景,步骤如下:

  1. 创建自定义资源包(比如my.swing.resources.basic_sv.properties),复制默认资源包的所有键并翻译成瑞典语;
  2. 通过UIManager.getDefaults().addResourceBundle("my.swing.resources.basic")将自定义资源包加入加载链,优先级高于系统默认资源包;
  3. 给JFileChooser指定瑞典语Locale:JFileChooser chooser = new JFileChooser(); chooser.setLocale(new Locale("sv", "SE"));

注意:JDK11+中,自定义资源包需放在模块路径下,module-info.java要声明requires java.desktop;,并开放资源包访问:opens my.swing.resources to java.desktop;

总结

  • JDK11+失效是模块化导致内部资源包访问受限,且Locale依赖逻辑调整;
  • UIManager.put是直接覆盖缓存,优先级最高,适合局部修改;
  • JFileChooser确实依赖ResourceBundle,自定义资源包是更完整的全量本地化方案。

内容的提问来源于stack exchange,提问作者Oscar Josefsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:35:20