2013-08-07 7 views
5

하나의 텍스트 필드는 라틴 문자로 입력해야하며 다른 문자는 아랍어로 입력해야하는 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); 
} 

당신 덕분입니다!

답변

0

이 B 이벤트에 콜백이 호출되었는지 여부를 추적하기 위해 전역 변수를 만드는 방법은 어떻습니까? B 이벤트가 생성 될 때마다 반전되는 단순 부울 플래그 일 수 있습니다. 플래그가 참일 때만 B를 출력합니다.

관련 문제