JTextField中的德语字符

KCH*_*KCH 6 java unicode swing jtextfield

我正在为学习德语的人们开发一个Java应用程序,我遇到了这种语言的特殊字符的问题.我想创建一个JTextField的子类,它将ALT + a解释为ä,将ALT + o解释为ö等,同时对所有ASCII字符执行常规操作.

到目前为止我的尝试:

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


}
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用(GermanTextField行为类似于标准的JTextField),当我打印evt.getKeyChar()到控制台时,这是我得到的:

?
?
?
?
Run Code Online (Sandbox Code Playgroud)

这可能是由于我自己的语言,因为ALT + o在我的系统上产生ó.当然我可以这样做:

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

但它可能不适用于波兰以外的任何系统.

我的问题是:这个问题的解决方案是否会在具有不同语言设置的系统上按预期运行?


完全解决这个问题,基于MvGs答案:

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


}
Run Code Online (Sandbox Code Playgroud)

MvG*_*MvG 6

要识别与当前区域设置无关的关键事件,请不要使用getKeyChar.相反,用于isKeyCode()识别与其关联的字符无关的密钥.像这样:

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown())
Run Code Online (Sandbox Code Playgroud)

这应该匹配任何键盘布局上的Alt Gr+ O.