Java 使用DocumentFilter.replace替换为unicode字符

Java 使用DocumentFilter.replace替换为unicode字符,java,swing,unicode,chars,documentfilter,Java,Swing,Unicode,Chars,Documentfilter,我正在构建一个GUI,其中一个文本字段必须用拉丁字符输入,其他文本字段必须用阿拉伯语输入。为了避免切换键盘布局,我选择用阿拉伯语维护它,并在特定的文本字段中使用DocumentFilter根据拉丁azerty布局将阿拉伯语字符替换为对应的阿拉伯语字符。 例如,如果有人键入“\u0628”(它是“ب”),则应将其打印为“F”,因为在中,它们位于同一个键中。 除B键外,这对所有字符都适用,B键在阿拉伯语布局中翻译为两个字符“لا”,DocumentFilter.replace对每个字符调用两次。 调

我正在构建一个GUI,其中一个文本字段必须用拉丁字符输入,其他文本字段必须用阿拉伯语输入。为了避免切换键盘布局,我选择用阿拉伯语维护它,并在特定的文本字段中使用DocumentFilter根据拉丁azerty布局将阿拉伯语字符替换为对应的阿拉伯语字符。 例如,如果有人键入“\u0628”(它是“ب”),则应将其打印为“F”,因为在中,它们位于同一个键中。 除B键外,这对所有字符都适用,B键在阿拉伯语布局中翻译为两个字符“لا”,DocumentFilter.replace对每个字符调用两次。 调用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);
}
。。。
私有静态字符[]拉丁语={'A','Z','E','R','T','Y','U','I','O','P',…};
私有静态字符[]阿拉伯语={'\u0636','\u0635','\u062B','\u0642','\u0641',…};
...    
(PlainDocument)txtFileId.getDocument().setDocumentFilter(新DocumentFilter(){
@凌驾
public void replace(DocumentFilter.FilterBypass fb,int offset,int length,String text,AttributeSet attr)引发BadLocationException{
StringBuilder sb=新的StringBuilder();
int i=0;
如果(text.length()==1){

while(text.charAt(0)!=阿拉伯语[i]&&i如何创建一个全局变量来跟踪是否为此B事件调用了回调?它可以是一个简单的布尔标志,每次生成B事件时都会翻转。只有当该标志为真时,才输出B