Как отображать японские символы в JTextArea - PullRequest
5 голосов
/ 05 апреля 2009

При отображении японских символов JTextArea имеет странное поведение - вместо кандзи я получаю хорошо известные пустые прямоугольники. Самое странное, что JTextField отображает их отлично (в обоих случаях я использую семейство шрифтов «Tahoma»). Также, если я поставлю этот код:

    Font f = new Font("123", Font.PLAIN, 12); // This font doesn't exists
    problemTextArea.setFont(f);

... перед тем, как я напишу японскую строку в задачу, текст отображает кандзи!

P.S. Извините за мой английский.

Upd: Я использую Windows

1 Ответ

10 голосов
/ 06 апреля 2009

Проблема в том, что JTextArea использует шрифт по умолчанию, отличный от JTextField. У меня была такая же проблема в приложении, которое я написал, которое должно было поддерживать несколько языков.

Причина вашей проблемы в том, что JTextArea обычно используется для отображения моноширинного шрифта, такого как Courier New. Обычно Java не содержит дополнительных отображений для моноширинного графического шрифта для отображения кандзи.

Исправление у вас работает, потому что нет шрифта с именем «123», поэтому берется значение по умолчанию (диалог). Шрифт "dialog" внутренне сопоставлен с семейством шрифтов в файле font.properties вашей платформы. Это будет тот же шрифт, который использует JTextField.

У меня есть следующее исправление, чтобы гарантировать, что одно и то же определение шрифта используется во ВСЕХ графических компонентах. Вы также можете найти специальный ключ для JTextArea и изменить его. Таким образом, вам не нужно беспокоиться о шрифтах любого компонента, они будут инициализированы с помощью диалога.

Object fontDefinition = new UIDefaults.ProxyLazyValue("javax.swing.plaf.FontUIResource", null, new Object[] { "dialog", new Integer(Font.PLAIN), new Integer(12) });

java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
    Object key = keys.nextElement();
    Object value = UIManager.get(key);
    if (value instanceof javax.swing.plaf.FontUIResource) {
        UIManager.put(key, fontDefinition);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...