我正在为学习德语的人们开发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();
}
}
但它可能不适用于波兰以外的任何系统。
我的问题是:这个问题的解决方案是否会在具有不同语言设置的系统上按预期运行?
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();
}
}
}
答案 0 :(得分:6)
要识别与当前区域设置无关的关键事件,请不要使用getKeyChar
。相反,使用isKeyCode()
来标识与其关联的字符无关的密钥。像这样:
if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown())
这应该匹配任何键盘布局上的 Alt Gr + O 。
答案 1 :(得分:1)
这可能是由于我自己的语言,因为ALT + o在我的系统上产生ó。当然我可以这样做:
将DocumentFilter用于JTextComponents
但它可能不适用于抛光以外的任何系统。
我的问题是:这个问题的解决方案是否会在具有不同语言设置的系统上按预期运行?
没有,
希望所有PC都在Locale
Native OS
{错误决定
Unicode Chars
的正确值
您可以使用ALT
和numbers
Locale
最安全的只是关于Locale
的使用设置,然后您可以为具体Encode Page
创建一个字符数组(自己为{{1}})
答案 2 :(得分:0)
问题是JTextField使用与JTextArea不同的默认字体。我在写的一个必须支持多语言的应用程序中遇到了同样的问题。
问题的原因是JTextField通常用于显示单行间距字体,例如Courier New。通常,Java不包含用于显示汉字的单倍间距图形字体的附加映射。
你有的修复工作,因为没有名为“123”的字体,所以默认采用(对话框)。 “对话框”字体在内部映射到平台的font.properties文件中的字体系列。这将是JTextField使用的相同字体。
我有以下修复,以确保在所有图形组件中使用相同的字体定义。您还可以找到JTextField的特定键并进行更改。这样您就不必担心任何组件的字体,它们将使用对话框进行初始化。 请在包含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);
}
}
希望这有帮助。