2013-08-07 63 views
5

我建立一个GUI其中一个文本框必须以拉丁字符输入,其他人用阿拉伯语。为了避免切换键盘布局,我选择将其保留为阿拉伯文,并在该特定文本字段中使用DocumentFilter,以根据拉丁风格布局将阿拉伯字符替换为对应字符。 例如,如果一个类型为'\ u0628'(它是'ب'),则应该打印'F',因为它们在同一个键中。 这在阿拉伯语布局工作得很好用的所有字符除与B键,翻译成字符“لا”,并DocumentFilter.replace被称为每个字符两次。 有没有办法来控制文本参数的大小被调用的时候更换?任何其他解决方案的问题?使用DocumentFilter.replace Unicode字符

这是我原来的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.