2009-04-05 14 views
5

Existe un comportamiento extraño de JTextArea al mostrar caracteres japoneses: obtengo rectángulos en blanco bien conocidos en lugar de kanji. Lo más extraño es que JTextField los muestra perfectamente (en ambos casos utilizo la familia de fuentes "Tahoma"). Además, si pongo este código:Cómo mostrar caracteres japoneses en JTextArea

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

... Antes de escribir la cadena japonesa a la problemTextArea muestra kanji!

P.S. Lo siento por mi ingles.

UPD: estoy usando Windows

+0

¿Qué plataforma está utilizando? Windows? Linux? – Peter

Respuesta

10

El problema es que JTextArea utiliza una fuente predeterminada diferente que JTextField. Tuve el mismo problema en una aplicación que escribí que tenía que admitir varios idiomas.

El motivo de su problema es que JTextArea se usa normalmente para mostrar una fuente monoespaciada, como Courier New. Normalmente Java no contiene asignaciones adicionales para una fuente gráfica monoespaciada para mostrar Kanji.

La corrección que tiene funciona, porque no hay una fuente llamada "123", por lo que se toma el valor predeterminado (diálogo). La fuente de "diálogo" está asignada internamente a una familia de fuentes en el archivo font.properties de su plataforma. Esta será la misma fuente que utiliza JTextField.

Tengo la siguiente solución para garantizar que se utiliza la misma definición de fuente en TODOS los componentes gráficos. También puede encontrar la clave específica para JTextArea y cambiarla. De esta forma, no tiene que preocuparse por las fuentes de ningún componente, se inicializarán con el diálogo.

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); 
    } 
} 
Cuestiones relacionadas