Как отфильтровать недопустимые / запрещенные символы имени файла с клавиатуры пользователя в JTextField? - PullRequest
1 голос
/ 26 апреля 2011

Я хочу отфильтровать ввод с клавиатуры пользователя на наличие недопустимых / запрещенных символов имени файла в 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 ]

4 голосов
/ 26 апреля 2011

Что-то вроде этого:

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 голосов
/ 26 апреля 2011

Использование JFormattedTextField - см. Здесь и здесь

Поля форматированного текста предоставляют разработчикам возможность указать действительный набор символов, которые могутнабирается в текстовом поле

2 голосов
/ 27 апреля 2011

Большое спасибо за ответы. Я решил использовать ответ Итая, чтобы решить проблему. Вот мое решение.

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 также кажется хорошим решением, но ответ Итая был для меня более простым. Большое спасибо!

0 голосов
/ 26 апреля 2011

InputVerifier дополняет JFormattedTextField красиво, как видно здесь .

...