2013-08-07 15 views
5

アラビア語では1つのテキストフィールドをラテン文字で入力する必要があるGUIを構築しています。キーボードレイアウトを切り替えるのを避けるために、私はアラビア語でそれを維持し、その特定のテキストフィールドでDocumentFilterを使用して、アラビア語の文字をlatin azertyのレイアウトに従って対応するものに置き換えました。 例: '\ u0628'(これは 'ب')を入力すると、同じキーになっているため、 'F'と表示されます。 アラビア語のレイアウトで2つの文字 "لا"に変換されるBキー以外のすべての文字で問題なく機能し、DocumentFilter.replaceは各文字に対して2回呼び出されます。 replaceを呼び出すときにのテキスト引数のサイズを制御する方法はありますか?問題の他の解決策?DocumentFilter.replaceをユニコード文字で使用する

はここに私の元DocumentFilter.replaceコード

... 
private static char[] latin = {'A','Z','E','R','T','Y','U','I','O','P',...}; 
private static char[] arabic = {'\u0636','\u0635','\u062B','\u0642','\u0641',...}; 
...  
(PlainDocument) txtFileId.getDocument().setDocumentFilter(new DocumentFilter() { 
    @Override 
    public void replace(DocumentFilter.FilterBypass fb, int offset,int length, String text, AttributeSet attr) throws BadLocationException { 
    StringBuilder sb = new StringBuilder(); 
    int i=0; 
    if (text.length()==1) { 
     while (text.charAt(0)!=arabic[i] && i<arabic.length) 
     i++; 
    if (text.charAt(0)==arabic[i]) 
     sb.append(latin[i]); 
    } 
    if (text.length()==2) { 
     if (text.equals(new String(new char[]{'\u0627','\u0644'}))) 
     sb.append('B'); 
    } 
    super.insertString(fb, offset, sb.toString(), attr); 
} 

おかげあなたです!

答えて

0

このBイベントに対してコールバックが呼び出されたかどうかを追跡するグローバル変数を作成する方法はありますか?これは、Bイベントが生成されるたびに反転する簡単なブール・フラグです。フラグが真であるときだけBを出力します。

関連する問題