JColorChooser и локализация - PullRequest
       20

JColorChooser и локализация

1 голос
/ 08 октября 2011

Я пытаюсь отладить проблему, в которой я использую JColorChooser. Я пытаюсь установить локальный, но он продолжает возвращаться к локали системы, несмотря на то, что я установил UIManager, Locale.setDefault или JColorChooser.setLocale.

Язык, который я устанавливаю для JColorChooser, отличается от языка системы. Остальная часть моего апплета использует запрошенный интерфейс.

Я пробовал следующее:

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

Однако ни один из этих параметров не изменяет компонент.

1 Ответ

1 голос
/ 08 октября 2011

EDIT

, как я упоминал ранее (ниже :-), поддержка локали JColorChooser (и большинства других локализуемых готовых компонентов) неоптимальна (иначе: глючит). Установка его свойства locale напрямую просто не работает. Рабочая форма настройки для каждого приложения (по умолчанию у меня немецкий язык):

Locale.setDefault(new Locale("es"));

Делайте это очень рано в коде приложения, лучше всего перед созданием любого компонента, дающего наилучшие шансы получить ожидаемые несистемные локализованные тексты.

Оригинальный ответ (немного побежав)

Поддержка локализации в Swing, мягко говоря, нерешительная.

Отчасти проблема заключается в несоответствии импеданса между механизмом разрешения локали между AWT и Swing: первый разрешает родительскую цепочку, ожидая, что большинство дочерних элементов будет иметь нулевое свойство локали, а второй явно устанавливает значение по умолчанию, возвращаемое JComponent.getDefaultLocale () очень рано в своей жизни (в конструкторе JComponent). Другая часть проблемы заключается в том, что setLocale запускает событие изменения соответствующим образом ... но никто не слушает. Это имеет драматические последствия для сборных контейнеров, таких как f.i. JColorChooser: делегат пользовательского интерфейса должен обновить свойство locale всех дочерних элементов, но просто ничего не делает. (Это легко пропустить - компоненты SwingX, такие как datePicker, имели ту же проблему, которая, мы надеемся, теперь исправлена; -)

Что еще хуже: по какой-то причине пользовательский интерфейс даже не соблюдает значение по умолчанию, установленное в JComponent ...

Таким образом, единственный способ заставить его полностью уважать любую локаль, кажется, установить локаль по умолчанию на локаль, а затем восстановить ее (если вы хотите, чтобы в этой локали был только средство выбора цвета, что я не думаю, это то, что вы хотите: -)

    Locale old = Locale.getDefault();
    Locale.setDefault(new Locale("es"));
    JColorChooser chooser = new JColorChooser(Color.RED);
    Locale.setDefault(old);

аааа .. все панели (DefaultXXChooserPanel), установленные пользовательским интерфейсом, глючат из-за того, что они получают локализованный текст на

   // wrong:
   UIManager.getString(somekey)

вместо

   // correct
   UIManager.getString(somekey, appropriateLocale) 
...