2011-04-26 2 views
1

JTextField에서 사용자의 키보드 입력을 불법/금지 파일 이름 문자로 필터링하려고합니다. 이미 JTextField에서 대문자 필터를 설정했습니다.JTextField에서 사용자의 키보드 입력에서 불법적이거나 금지 된 파일 이름 문자를 필터링하는 방법은 무엇입니까?

DocumentFilter dfilter = new UpcaseFilter(); 
JTextField codeTF = new JTextField(); 
((AbstractDocument) codeTF.getDocument()).setDocumentFilter(dfilter); 

다음은 JTextfield에서 소문자에서 대문자로 변경하는 데 사용하는 필터입니다.

class UpcaseFilter extends DocumentFilter 
{ 
    public void insertString (DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException 
    { 
     fb.insertString (offset, text.toUpperCase(), attr); 
    } 

    public void replace (DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException 
    { 
     fb.replace(offset, length, text.toUpperCase(), attr); 
    } 
} 

어떻게이 문제를 해결할 수 있습니까?

답변

4

뭔가 이러한 라인을 따라 텍스트 필드에 입력 할 수있는 문자의 유효 집합을 지정할 수있는 방법을 제공 :

class FileNameFilter extends DocumentFilter { 
    public void insertString (DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { 
    fb.insertString (offset, fixText(text), attr); 
} 

    public void replace (DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException { 
    fb.replace(offset, length, fixText(text), attr); 
    } 

    private String fixText(String s) { 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < s.lenght(); ++i) { 
     if(isLegalFileNameChar(s.charAt(i)) 
     sb.append(s.charAt(i)); 
    } 

    return sb.toString(); 
    } 

    private boolean isLegalFileNameChar(char c) { 
    // Your logic goes here ... 
    } 
} 
3

사용 JFormattedTextField-see herehere

서식있는 텍스트 필드는 개발자가

+0

불행히도 JFormattedTextField는 _entering_ illegal 문자는 방지하지 않지만 나중에 검사하기 때문에이 목적으로는 작동하지 않습니다. –

1

답변 해 주셔서 감사합니다. 나는 Itay의 답을 사용하여 문제를 해결하기로 결정했다. 여기 내 해결책이있다.

DocumentFilter dfilter = new FileNameFilter(); 
JTextField codeTF = new JTextField(); 
((AbstractDocument) codeTF.getDocument()).setDocumentFilter(dfilter); 

다음은 잘못된 문자가 삽입 된 FileNameFilter입니다. 이것은 Unix, Windows 및 Mac OS에서 작동합니다.

class FileNameFilter extends DocumentFilter 
{ 
    private static final char[] ILLEGAL_CHARACTERS = {'/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':', '.'}; 

    public void insertString (DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException 
    { 
     fb.insertString (offset, fixText(text).toUpperCase(), attr); 
    } 

    public void replace (DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException 
    { 
     fb.replace(offset, length, fixText(text).toUpperCase(), attr); 
    } 

    private String fixText (String s) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0; i < s.length(); ++i) 
     { 
      if (!isIllegalFileNameChar (s.charAt (i))) 
       sb.append (s.charAt (i)); 
     } 
     return sb.toString(); 
    } 

    private boolean isIllegalFileNameChar (char c) 
    { 
     boolean isIllegal = false; 
     for (int i = 0; i < ILLEGAL_CHARACTERS.length; i++) 
     { 
      if (c == ILLEGAL_CHARACTERS[i]) 
       isIllegal = true; 
     } 
     return isIllegal; 
    } 
} 

JFormattedTextField도 좋은 해결책 인 것처럼 보이지만 Itay의 대답은 나에게 더 간단합니다. 고마워요!

관련 문제