私はドイツ語を学ぶ人々のためのJavaアプリケーションに取り組んでいますが、この言語の特殊文字に問題が発生しました。すべてのASCII文字に対して通常どおりに動作しながら、ALT + aをä、ALT +oをöなどとして解釈するJTextFieldのサブクラスを作成したいと思います。
これまでの私の試み:
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();
}
}
ただし、ポーランド語以外のシステムではおそらく機能しません。
私の質問は、言語設定が異なるシステムで期待どおりに動作するこの問題の解決策はありますか?
MvGの回答に基づく、この問題の完全な解決策:
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();
}
}
}