2009-04-05 5 views
5

Il ya un comportement étrange de JTextArea lors de l'affichage des caractères japonais - je reçois des rectangles vierges bien connus au lieu de kanji. La chose la plus étrange est que JTextField les affiche parfaitement (dans les deux cas j'utilise la famille de police "Tahoma"). En outre, si je mets ce code:Comment afficher les caractères japonais dans JTextArea

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

... avant d'écrire la chaîne japonaise à l'problemTextArea il affiche kanjis!

P.S. Désolé pour mon anglais.

Upd: J'utilise Windows

+0

Quelle plateforme utilisez-vous? Les fenêtres? Linux? – Peter

Répondre

10

Le problème est que JTextArea utilise une autre police par défaut que JTextField. J'ai eu le même problème dans une application que j'ai écrite qui devait supporter plusieurs langues.

La raison de votre problème est que JTextArea est normalement utilisé pour afficher une police mono-espacée, telle que Courier New. Normalement Java ne contient aucun mappage supplémentaire pour une police graphique mono-espacée pour afficher Kanji.

Le correctif que vous avez fonctionne, car il n'y a pas de police nommée "123", donc la valeur par défaut est prise (boîte de dialogue). La police "dialog" est mappée en interne à une famille de polices dans le fichier font.properties de votre plate-forme. Ce sera la même police que JTextField utilise.

J'ai le correctif suivant, pour m'assurer que la même définition de police est utilisée dans TOUS les composants graphiques. Vous pouvez également trouver la clé spécifique pour JTextArea et la modifier. De cette façon, vous n'avez pas à vous soucier des polices d'un composant, elles seront initialisées avec un dialogue.

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); 
    } 
} 
Questions connexes