JDK 13中JOptionPane按钮无法本地化问题求助
JOptionPane按钮本地化在JDK 13失效的解决方案
我来帮你解决这个问题——JDK 13里JOptionPane无法显示西班牙语(墨西哥)本地化按钮的情况,确实和JDK 9引入的模块化系统以及Locale加载逻辑变化有关,咱们一步步拆解:
最快速的修复:显式设置JOptionPane的Locale
你代码里注释掉的JOptionPane.setDefaultLocale(locale);就是关键!在JDK 8中,设置系统默认Locale会自动同步到Swing组件,但从JDK 9开始,Swing组件的Locale和系统默认Locale的绑定关系被弱化了,必须显式给组件指定Locale才能生效。
把注释取消,修改后的代码如下:
public class test { public static void main(String... args) { Locale locale = Locale.forLanguageTag("es-MX"); Locale.setDefault(locale); JOptionPane.setDefaultLocale(locale); // 取消这行注释 JOptionPane.showConfirmDialog(null, "did it work?"); } }
运行这段代码,你应该就能看到西班牙语的按钮文本了。
关于ResourceBundle的疑问解答
你猜的没错,JOptionPane确实依赖JDK自带的ResourceBundle加载本地化字符串,完全不需要自己从头创建。它使用的资源包路径是javax.swing.plaf.basic.resources.basic,属于java.desktop模块。
你可以用这段代码验证资源包是否能正常加载:
Locale locale = Locale.forLanguageTag("es-MX"); ResourceBundle bundle = ResourceBundle.getBundle("javax.swing.plaf.basic.resources.basic", locale); System.out.println(bundle.getString("OptionPane.yesButtonText"));
如果输出是西班牙语的Sí,说明资源包存在且能正常加载,问题只是JOptionPane没用到指定的Locale;如果加载失败,大概率是你用的JDK是精简版(比如某些定制的JRE),缺少了es-MX的本地化资源,这种情况下换完整版本的OpenJDK/Oracle JDK即可解决。
模块化环境的额外注意事项
如果你的应用是模块化项目(有module-info.java),需要确保模块声明中依赖了java.desktop模块,否则会无法访问Swing的本地化资源:
module your.app.module { requires java.desktop; }
内容的提问来源于stack exchange,提问作者LeedMx
相关产品推荐
相关产品推荐

