java - JTextField 中的德语字符

标签 java swing unicode 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();
    }
  }


}

上面的代码不起作用(GermanTextField 表现得像标准的 JTextField),当我打印 evt.getKeyChar() 来控制时,我得到的是:

?
?
?
?

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

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

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

我的问题是:对于这个问题,是否有任何解决方案可以在具有不同语言设置的系统上按预期运行?


此问题的完整解决方案,基于 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();
    }
  }


}

最佳答案

要识别独立于当前语言环境的按键事件,请不要使用 getKeyChar。相反,使用 isKeyCode() 来识别独立于与之关联的字符的键。像这样:

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

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

关于java - JTextField 中的德语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12415960/

相关文章:

java - 如何使用 Eclipse 在 Java 中批量清理导入?

java - StringBuffer - 使用 charAt 追加返回 null

java - "java.awt.EventQueue.invokeLater"或"new Myframe().setVisible(true) , What'有什么区别?

javascript - 拉丁字符检查

python - 如何在 Windows cmd 上打印不支持的 unicode 字符,例如 "?"而不是引发异常?

java - 如何使用java向json添加数据?

java - 在 log4j 中配置 SMTPAppender 的正确方法是什么?

java - 使用 Swing 显示 Java 系统属性

java - 在 Clojure 中扩展 Java Swing 类

c++ - 以字节模式将宽字符串写入文件停止