6

私はドイツ語を学ぶ人々のための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();
    }
  }


}
4

3 に答える 3

6

現在のロケールに関係なく重要なイベントを識別するには、を使用しないでくださいgetKeyChar。代わりに、にisKeyCode()関連付けられている文字とは関係なく、キーを識別するために使用します。このような:

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown())

これは、どのキーボードレイアウトでもAlt Gr+と一致する必要があります。O

于 2012-09-13T23:55:51.580 に答える
1

ALT + oは私のシステムでóを生成するため、これは私自身の言語が原因である可能性があります。もちろん、私はそのようにすることができたでしょう:

JTextComponentsにDocumentFilter を使用する

ただし、ポリッシュ以外のシステムではおそらく機能しません。

私の質問は、言語設定が異なるシステムで期待どおりに動作するこの問題の解決策はありますか?

  • いいえ、ありません、

  • すべてのPCが正しい値を入力していることを期待するLocaleNative OS間違った決定)

  • Unicode Charsとを使用ALTして任意の書き込みを行うことができますnumbers

  • 最も安全なのは、に関するユーザーアクションによる設定のみです。次に、concrete (own )Localeのcharの配列を作成できます。LocaleEncode Page

于 2012-09-14T00:17:08.693 に答える
0

問題は、JTextFieldがJTextAreaとは異なるデフォルトフォントを使用することです。多言語をサポートする必要のある、自分が作成したアプリケーションでも同じ問題が発生しました。

問題の理由は、JTextFieldは通常、CourierNewなどの等幅フォントを表示するために使用されるためです。通常、Javaには、漢字を表示するための等幅グラフィカルフォント用の追加のマッピングは含まれていません。

「123」という名前のフォントがないため、修正が機能し、デフォルトが使用されます(ダイアログ)。「dialog」フォントは、プラットフォームの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);
    }
}

お役に立てれば。

于 2012-09-13T23:13:16.283 に答える