2012-09-13 18 views
6

Estoy trabajando en una aplicación Java para personas que están aprendiendo alemán, y me he encontrado con un problema con los caracteres especiales de este idioma. Quiero hacer una subclase de JTextField que interpretará ALT + a como ä, ALT + o como ö y así sucesivamente, mientras se comporta como siempre para todos los caracteres ASCII.Caracteres alemanes en JTextField

Mis intentos hasta ahora:

public class GermanTextField extends JTextField implements KeyListener{ 
    public GermanTextField() { 
    init(); 
    } 

    // other constructors ... 

    private void init() { 
    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent arg0) {} 


    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'o' && evt.isAltGraphDown()){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 


} 

Código anterior no funciona (GermanTextField se comporta como norma JTextField), y al imprimir evt.getKeyChar() a la consola esto es lo que me sale:

? 
? 
? 
? 

Este puede deberse a mi propio idioma, porque ALT + o produce ó en mi sistema. Por supuesto que podría haberlo hecho así:

public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'ó'){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 

Pero probablemente no funcionará en ningún otro sistema que no sea polaco.

Mi pregunta es: ¿hay alguna solución a este problema que se comporte como se espera en sistemas con configuraciones de idioma diferentes?


solución completa a este problema, basado en MVGS responder:

package daswort.gui; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JTextField; 

public class GermanTextField extends JTextField implements KeyListener{ 

    private Map<Integer, String> transform = 
     new HashMap<Integer, String>(); 

    public GermanTextField() { 
    init(); 
    } 


    public GermanTextField(int columns) { 
    super(columns); 
    init(); 
    } 


    public GermanTextField(String text, int columns) { 
    super(text, columns); 
    init(); 
    } 


    public GermanTextField(String text) { 
    super(text); 
    init(); 
    } 


    private void init() { 
    transform.put(KeyEvent.VK_A, "äÄ"); 
    transform.put(KeyEvent.VK_U, "üÜ"); 
    transform.put(KeyEvent.VK_O, "öÖ"); 

    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     String umlaut = transform.get(evt.getKeyCode()); 
     if(umlaut != null){ 
     int idx = evt.isShiftDown() ? 1 : 0; 
     setText(getText() + umlaut.charAt(idx)); 
     } 
    } 
    } 

    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     evt.consume(); 
    } 
    } 


} 
+0

La entrada a su aplicación depende de lo que el sistema operativo en el que se ejecuta la aplicación produce para Alt-A o Alt-o, que probablemente dependerá de la configuración regional del sistema operativo o el teclado específicamente. – Pao

+0

¿En qué sistema operativo estás trabajando? Usted escribe eso para usted "ALT + o produce ó", pero en la mayoría de los sistemas operativos que conozco, Alt está disponible para accesos directos a las aplicaciones. La única excepción notable es OS X, donde Alt desempeña el papel de [Alt Gr] (http://en.wikipedia.org/wiki/AltGr_key), es decir, habilita caracteres alternativos. – MvG

Respuesta

6

Para identificar eventos clave independientes de la configuración regional actual, no use getKeyChar. En su lugar, use isKeyCode() para identificar la clave independientemente del carácter asociado con ella. De esta manera:

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown()) 

Este debe coincidir con Alt Gr +O en cualquier disposición del teclado.

+1

evt.getKeyCode() devuelve algo significativo solo en los eventos keyPressed() y keyReleased(), por lo que este enfoque no funciona (lo he comprobado anteriormente) – KCH

+0

Utilicé lo que sugirió de una manera ligeramente diferente (coloque su código en keyPressed(), consumió todos los eventos con ALT GR presionado en keyTyped()) y funciona como yo quería. Gracias. – KCH

0

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

El motivo de su problema es que JTextField normalmente se usa 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 JTextField y cambiarla. De esta forma, no tiene que preocuparse por las fuentes de ningún componente, se inicializarán con el diálogo. Por favor, introduzca el siguiente código dentro de su clase que contiene el JTextField.

Object fontDefinition = new UIDefaults.ProxyLazyValue("javax.swing.plaf.FontUIResource", null, new Obje 

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

Espero que esto ayude.

+0

Después de formatear el código, parece que falta algo al final de la primera línea. ¿Podrías hacer una edición apropiada? –

+0

@ Code-Guru gracias por su corrección, pero no creo que falta nada. – Ewen

+2

Mire la primera línea. Termina con 'nuevo Obje'. Algo ciertamente falta allí. (Es posible que deba desplazar el código hacia la derecha para ver esto.) –

1

Esto puede ser debido a mi propio idioma, porque ALT + o produce ó en mi sistema.Por supuesto que podría haber hecho así:

uso DocumentFilter para JTextComponents

Pero probablemente no funcionará en sistemas que no sean de uñas.

Mi pregunta es: ¿hay alguna solución a este problema que se comporte como se espera en sistemas con configuraciones de idioma diferentes?

  • no está allí no son,

  • esperar que todos los PC han llegado valor correcto para el imputado Locale en Native OS (decisión equivocada)

  • que son capaces de cualquier escribió Unicode Chars usando ALT y numbers

  • más seguro es solo el ajuste por useraction sobre la Locale, entonces se puede crear un conjunto de caracteres para el hormigón Locale (propia Encode Page)

+1

Me cuesta mucho averiguar qué significan realmente los fragmentos de oraciones en la lista de elementos. No los editaré ya que todavía no estoy seguro. – MvG

Cuestiones relacionadas