JColorChooser和本地化

时间:2011-10-07 21:45:47

标签: swing jcolorchooser

我正在尝试调试我正在使用JColorChooser的问题。我正在尝试设置本地,但它不断恢复到系统的Locale,尽管我设置了UIManager,Locale.setDefault或JColorChooser.setLocale。

我正在设置JColorChooser的语言环境与系统语言环境不同。我的applet的其余部分正在使用请求的UI。

我尝试了以下内容:

 JColorChooser colors = new JColorChooser();
 colors.setLocale([spanish]);
 Locale.setLocale([spanish]);
 UIManager.getDefaults().setDefaultLocale([spanish]); 

但是,这些选项都不会更改组件。

1 个答案:

答案 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)