使用带有unicode字符的DocumentFilter.replace

Bra*_*bab 5 java unicode swing chars documentfilter

我正在构建一个GUI,其中一个文本字段必须用拉丁字符输入,其他文本字段用阿拉伯语输入.为了避免切换键盘布局,我选择用阿拉伯语维护它,并在该特定文本字段中使用DocumentFilter,根据拉丁语azerty布局将阿拉伯字符替换为对应字符.例如,如果有一个'\ u0628'(它是'ب'),则应该打印'F',因为它们在同一个键中.除了使用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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 0

创建一个全局变量来跟踪是否已为此 B 事件调用回调怎么样?它可以是一个简单的布尔标志,每次生成 B 事件时都会翻转。仅当标志为 true 时才输出 B。