2012-09-13 36 views
6

ドイツ語を学ぶ人々のためのJavaアプリケーションで作業しています。この言語の特殊文字に問題があります。私はJTextFieldのサブクラスを作成して、ALT + aをä、ALT + oをöなどと解釈し、すべてのASCII文字に対して通常どおりに動作させたいと考えています。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(); 
    } 
    } 


} 

は、上記のコードは、(標準のJTextFieldのようなGermanTextField振舞う)動作しない、と私はコンソールに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(); 
    } 
    } 


} 
+0

コンクリートLocale(自分のEncode Page)のために文字の配列を作成するために、あなたができる、Localeについてuseractionで設定したり、 Alt-oは、osやキーボードの地域設定に依存する可能性があります。 – Pao

+0

あなたは現在どのオペレーティングシステムを使用していますか?あなたはあなたのために "ALT + oはoを生成する"と書いていますが、私が知っているほとんどのOSではAltをアプリケーションのショートカットに利用できます。注目すべき例外はOS Xで、Altは[Alt Gr](http://en.wikipedia.org/wiki/AltGr_key)の役割を果たします。つまり、代替文字を有効にします。 – MvG

答えて

6

現在のロケールに依存しないキーイベントを特定するには、getKeyCharを使用しないでください。代わりに、isKeyCode()を使用して、関連する文字とは独立したキーを識別します。このように:

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

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

+1

evt.getKeyCode()は、keyPressed()イベントとkeyReleased()イベントで意味のあるものを返します。このアプローチは機能しません(前にチェックしました) – KCH

+0

私はあなたの提案を少し違った方法で使用しました(keyPressed()にコードを置き、keyTyped()でALT GRを押したまますべてのイベントを消費しました)。ありがとう。 – KCH

0

問題はJTextFieldのがJTextAreaには異なるデフォルトフォントを使用していることです。私は多言語をサポートするために書いたアプリケーションで同じ問題を抱えていました。

なぜなら、JTextFieldはCourier Newなどのモノスペースフォントを表示するために通常使用されるからです。通常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); 
    } 
} 

希望します。

+0

コードを書式設定した後、最初の行の最後に何かがないように見えます。あなたは適切な編集をしてくださいますか? –

+0

@ Code-Guruはあなたの修正に感謝しますが、私は何かが欠けているとは思わない。 – Ewen

+2

最初の行を見てください。それは '新しいObje'で終わります。確かにそこには何かがありません。 –

1

これは自分の言語に起因する可能性があります。これは、ALT + oが自分のシステムでóを生成するためです。JTextComponents

ため

使用DocumentFilterをしかし、それはおそらく、ポリッシュ以外のシステムでは動作しません。もちろん、私はそのようにそれを行っている可能性があります。

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

  • はありません、存在しない

  • は、すべてのPCがNative OSLocale(間違った意思決定)のために帰属正しい値を持っていることを期待する

  • あなたはどんなUnicode Charsを書いたことができます​​とnumbers

  • 最も安全なのは、あなたのアプリケーションへの入力は、アプリケーションが実行されているOSは、Altキーを押しながらAの生成によって異なり

+1

私は、itemizeリストの文章の断片が実際にどういう意味か分かりません。私はまだよくわからないので、編集しないでください。 – MvG

関連する問題