Java JTextField中的德语字符

Java JTextField中的德语字符,java,swing,unicode,jtextfield,Java,Swing,Unicode,Jtextfield,我正在为学习德语的人开发一个Java应用程序,我遇到了这种语言的特殊字符的问题。我想创建一个JTextField的子类,它将ALT+a解释为ä,ALT+o解释为ö等等,同时对所有ASCII字符都像往常一样 我迄今为止的努力: public class GermanTextField extends JTextField implements KeyListener{ public GermanTextField() { init(); } // other const

我正在为学习德语的人开发一个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答案:
包daswort.gui;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.HashMap;
导入java.util.Map;
导入javax.swing.JTextField;
公共类GermanTextField扩展JTextField实现KeyListener{
私有映射转换=
新的HashMap();
公共GermanTextField(){
init();
}
公共GermanTextField(int列){
超级(列);
init();
}
公共GermanTextField(字符串文本,int列){
超级(文本、列);
init();
}
公共GermanTextField(字符串文本){
超级(文本);
init();
}
私有void init(){
transform.put(KeyEvent.VK_A,“äÄ”);
transform.put(KeyEvent.VK_,“üÜ”);
transform.put(KeyEvent.VK_O,“öÖ”);
addKeyListener(此);
}
按下公共无效键(KeyEvent evt){
if(evt.isAltGraphDown()){
字符串umlaut=transform.get(evt.getKeyCode());
如果(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();
}
}
}

问题在于JTextField使用的默认字体与JTextArea不同。在我编写的一个必须支持多种语言的应用程序中,我也遇到了同样的问题

问题的原因是JTextField通常用于显示单间距字体,例如Courier New。通常,Java不包含用于显示汉字的单间距图形字体的其他映射

由于没有名为“123”的字体,因此采用默认字体(对话框),所以您的修复程序可以正常工作。“对话框”字体在内部映射到平台的font.properties文件中的字体系列。这将是JTextField使用的相同字体

我有以下修复,以确保在所有图形组件中使用相同的字体定义。您还可以找到JTextField的特定键并对其进行更改。这样,您就不必担心任何组件的字体,它们将使用dialog进行初始化。 请在包含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);
    }
}

希望这有帮助。

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

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown())
这应该与任何键盘布局上的Alt Gr+O匹配

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

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

但它可能在波兰以外的任何系统上都不起作用

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

  • 没有

  • 希望所有PC都在
    本机操作系统
    中为
    区域设置
    输入了正确的值(错误的决定)

  • 通过使用
    ALT
    numbers

  • 最安全的只是用户操作对
    Locale
    的设置,然后您可以为具体
    Locale
    创建一个字符数组(自己的
    Encode页面


应用程序的输入取决于运行应用程序的操作系统为Alt-a或Alt-o生成的内容,这可能具体取决于操作系统或键盘的区域设置。您使用的是什么操作系统?你写的是“ALT+o生成ó”,但在我知道的大多数操作系统上,ALT可用于应用程序快捷方式。一个值得注意的例外是OS X,其中Alt起着替代字符的作用,即启用替代字符。格式化代码后,第一行末尾似乎缺少一些内容。请您进行适当的编辑好吗?@Code Guru谢谢您的修复,但我不认为缺少任何内容。请看第一行。它以
新Obje
结尾。那里肯定少了一些东西。(您可能需要将代码向右滚动才能看到这一点。)我很难弄清楚逐项列表中的句子片段实际上是什么意思。不会编辑它们,因为我仍然不确定。evt.getKeyCode()仅在keyPressed()和keyReleased()事件中返回有意义的内容,因此这种方法不起作用(我之前已经检查过了)。我以稍微不同的方式使用了您建议的方法(将代码放在keyPressed()中,在keyTyped()中使用ALT GR pressed来消耗所有事件)它就像我想要的那样工作。谢谢