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