Java JTextField中的德语字符
我正在为学习德语的人开发一个Java应用程序,我遇到了这种语言的特殊字符的问题。我想创建一个JTextField的子类,它将ALT+a解释为ä,ALT+o解释为ö等等,同时对所有ASCII字符都像往常一样 我迄今为止的努力: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
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页面
新Obje
结尾。那里肯定少了一些东西。(您可能需要将代码向右滚动才能看到这一点。)我很难弄清楚逐项列表中的句子片段实际上是什么意思。不会编辑它们,因为我仍然不确定。evt.getKeyCode()仅在keyPressed()和keyReleased()事件中返回有意义的内容,因此这种方法不起作用(我之前已经检查过了)。我以稍微不同的方式使用了您建议的方法(将代码放在keyPressed()中,在keyTyped()中使用ALT GR pressed来消耗所有事件)它就像我想要的那样工作。谢谢