2013-08-07 5 views
5

Ich baue eine GUI, wo ein Textfeld in lateinischen Buchstaben eingegeben werden muss, die anderen in arabischer Sprache. Um das Tastaturlayout nicht zu wechseln, habe ich beschlossen, es auf Arabisch zu halten und einen DocumentFilter in diesem speziellen Textfeld zu verwenden, um arabische Zeichen durch ihr Gegenstück gemäß einem lateinischen Azerty-Layout zu ersetzen. Beispiel, wenn man '\ u0628' (es ist 'ب'), sollte dies 'F' gedruckt werden, da sie in der gleichen Taste sind. Dies funktionierte gut mit allen Zeichen außer mit der B-Taste, die zwei Zeichen "لا" im arabischen Layout übersetzt, und der DocumentFilter.replace wird zweimal für jedes Zeichen aufgerufen. Gibt es eine Möglichkeit, die Größe von Text Argument zu steuern, wenn ersetzt wird? irgendeine andere Lösung für das Problem?mit DocumentFilter.replace mit Unicode-Zeichen

Hier ist meine ursprüngliche DocumentFilter.replace Code

... 
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); 
} 

Vielen Dank!

Antwort

0

Wie wäre es mit der Erstellung einer globalen Variablen, um zu verfolgen, ob Ihr Callback für dieses B-Ereignis aufgerufen wurde? Es kann ein einfaches boolesches Flag sein, das jedes Mal umkehrt, wenn das B-Ereignis generiert wird. Sie geben nur B aus, wenn das Flag wahr ist.