하나의 텍스트 필드는 라틴 문자로 입력해야하며 다른 문자는 아랍어로 입력해야하는 GUI를 작성하고 있습니다. 자판 레이아웃을 바꾸지 않기 위해, 나는 아랍어로 유지하고 라틴어 아차 타일 레이아웃에 따라 아라비아 문자를 해당 텍스트 필드로 바꾸기 위해 DocumentFilter를 사용하기로했습니다. 예를 들어 '\ u0628'('ب')을 입력하면 동일한 키에 있기 때문에 'F'로 인쇄해야합니다. 아랍어 레이아웃에서 두 개의 문자 "لا"로 변환되는 B 키를 제외한 모든 문자에서 문제가 없으며 각 문자에 대해 DocumentFilter.replace가 두 번 호출됩니다. replace를 호출 할 때 텍스트 인수의 크기를 제어하는 방법이 있습니까? 문제에 대한 다른 해결책?유니 코드 문자로 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);
}
당신 덕분입니다!