アラビア語では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);
}
おかげあなたです!