使用DocumentFilter.replace处理Unicode字符

5
我正在构建一个 GUI,其中一个文本框必须输入拉丁字符,另一个文本框必须输入阿拉伯语。为了避免切换键盘布局,我选择保持其为阿拉伯语并在该特定文本框中使用 DocumentFilter 将阿拉伯字符替换为相应的拉丁 azerty 布局。 例如,如果输入 '\u0628'(它是 'ب'),则应打印出 'F',因为它们在同一键上。 这对所有字符都有效,除了 B 键,在阿拉伯布局中,它将转换为 两个 字符“لا”,并且在每个字符上调用两次 DocumentFilter.replace。 是否有方法可以控制调用 replace 时 text 参数的大小?或者有其他解决问题的方法吗?
以下是我的原始 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);
}

谢谢您!
1个回答

0
创建一个全局变量来跟踪您的回调函数是否已经为此B事件调用过,如何?它可以是一个简单的布尔标志,每次生成B事件时都会翻转。只有在标志为true时才输出B。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接