我正在为学习德语的人开发一个 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/