2009-04-05 15 views
5

Esiste uno strano comportamento di JTextArea quando si visualizzano caratteri giapponesi: ottengo rettangoli vuoti noti invece di kanji. La cosa più strana è che JTextField li visualizza perfettamente (in entrambi i casi uso la famiglia di font "Tahoma"). Inoltre, se metto questo codice:Come visualizzare caratteri giapponesi in JTextArea

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

... prima di scrivere stringa giapponese al problemTextArea visualizza kanji!

P.S. Mi scusi per il mio inglese.

Upd: Sto usando Windows

+0

Quale piattaforma stai utilizzando? Finestre? Linux? – Peter

risposta

10

Il problema è che JTextArea utilizza un carattere predefinito diverso rispetto JTextField. Ho avuto lo stesso problema in un'applicazione che ho scritto che doveva supportare multi-lingue.

Il motivo del tuo problema è che JTextArea viene normalmente utilizzato per mostrare un carattere con spaziatura singola, come Courier New. Normalmente Java non contiene mappature aggiuntive per un font grafico a spaziatura singola per visualizzare Kanji.

La correzione che hai funziona, perché non c'è un font di nome "123", quindi il default è preso (finestra di dialogo). Il carattere "dialog" è mappato internamente a una famiglia di font nel file font.properties della piattaforma. Questo sarà lo stesso carattere utilizzato da JTextField.

Ho la seguente correzione, per garantire che la stessa definizione di carattere sia utilizzata in TUTTI i componenti grafici. Puoi anche trovare la chiave specifica per JTextArea e cambiarla. In questo modo non devi preoccuparti dei caratteri di alcun componente, saranno inizializzati con una finestra di dialogo.

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); 
    } 
} 
Problemi correlati