5

1 つのテキスト フィールドをラテン文字で入力し、他のテキスト フィールドをアラビア語で入力する必要がある GUI を構築しています。キーボード レイアウトの切り替えを避けるために、私はそれをアラビア語で維持し、その特定のテキスト フィールドで DocumentFilter を使用して、ラテン語の azerty レイアウトに従ってアラビア文字を対応する文字に置き換えることにしました。たとえば、'\u0628' ('ب') と入力すると、同じキーにあるため、'F' と出力されます。これは、B キーを除くすべての文字で正常に機能し、B キーはアラビア語のレイアウトで2文字の "لا" に変換され、DocumentFilter.replace は各文字に対して 2 回呼び出されます。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);
}

ありがとうございます!

4

1 に答える 1

0

この B イベントに対してコールバックが呼び出されたかどうかを追跡するグローバル変数を作成するのはどうでしょうか? これは、B イベントが生成されるたびに反転する単純なブール フラグにすることができます。フラグが true の場合にのみ B を出力します。

于 2013-08-10T04:44:04.637 に答える