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