我正在尝试调试我正在使用JColorChooser的问题。我正在尝试设置本地,但它不断恢复到系统的Locale,尽管我设置了UIManager,Locale.setDefault或JColorChooser.setLocale。
我正在设置JColorChooser的语言环境与系统语言环境不同。我的applet的其余部分正在使用请求的UI。
我尝试了以下内容:
JColorChooser colors = new JColorChooser();
colors.setLocale([spanish]);
Locale.setLocale([spanish]);
UIManager.getDefaults().setDefaultLocale([spanish]);
但是,这些选项都不会更改组件。
答案 0 :(得分:1)
修改强>
正如我前面提到的(下面:-),JColorChooser(和大多数其他可本地化的预制组件)区域设置支持是次优的(aka:buggy)。直接设置其语言环境属性不起作用。每个应用程序设置worksforme(我的系统默认为德语),但是:
Locale.setDefault(new Locale("es"));
在应用程序代码的早期这样做,最好在创建任何组件之前,提供获得预期的非系统本地化文本的最佳机会。
原始答案(稍微逛了一下)
Swing的本地化支持是半心半意的,温和地说。
部分问题是AWT与Swing之间的语言环境解析机制之间的阻抗不匹配:前者解析了父链,期望大多数子节点具有空语言环境属性,后者显式设置默认值为JComponent.getDefaultLocale()在其生命的早期(在JComponent构造函数中)。问题的另一部分是setLocale根据需要触发更改事件..但是没有人监听。这对f.i等预制容器产生了严重影响。 JColorChooser:ui委托应该更新所有孩子的locale属性,但什么都不做。 (这很容易被忽视 - 像datePicker这样的SwingX组件有同样的问题,希望现在可以解决; - )
更糟糕的是:由于某种原因,ui甚至不尊重JComponent上设置的默认值...
因此,使其完全尊重任何语言环境的唯一方法似乎是在Locale上设置默认语言环境,然后再恢复它(如果你想在该语言环境中只有颜色选择器,我不认为是你想要的: - )
Locale old = Locale.getDefault();
Locale.setDefault(new Locale("es"));
JColorChooser chooser = new JColorChooser(Color.RED);
Locale.setDefault(old);
啊......由ui安装的所有面板(DefaultXXChooserPanel)都有错误,因为它们通过
获取本地化文本 // wrong:
UIManager.getString(somekey)
而不是
// correct
UIManager.getString(somekey, appropriateLocale)