2013-06-07 3 views
0

Как это сделать с кодом? Я знаю, что могу использовать JFormattedTextField, но я делаю свою собственную библиотеку так, чтобы это можно было сделать JTextField. Вот методы, которые я пробовал:Предотвращение буквенно-цифровых символов в JTextField

  1. OnKeyRelease: Да, это самый лучший метод, который я нашел, я заменил все символы, которые я хочу с «». Но это медленный, я имею в виду, что он все еще показывает запрещенные символы, когда ключ не работает, и удаляет символы, когда ключ освобождается, точно так же, как имя его события. Что меня беспокоит.
  2. evt.consume: Я не знаю, почему этот метод работает на все, кроме цифр и букв, таких как Backspace, Home и т. Д. Любая идея, как сделать этот метод также работать с числами или буквами?

Если бы вы могли дать мне ключ или ссылку я бы признателен, спасибо :)

ответ

1

Если бы вы могли дать мне ключ или ссылку я бы признателен, спасибо :)

Как насчет Text Component Features - Implementing a Document Filter?

Чтобы реализовать фильтр документа, создать подкласс DocumentFilter, а затем прикрепить его к документу с использованием методы setDocumentFilter, определенной в AbstractDocument классе.

Это может помочь:

public class NoAlphaNumFilter extends DocumentFilter { 
    String notAllowed = "[A-Za-z0-9]"; 
    Pattern notAllowedPattern = Pattern.compile(notAllowed); 
    public void replace(FilterBypass fb, int offs, 
         int length, 
         String str, AttributeSet a) 
     throws BadLocationException { 

     super.replace(fb, offs, len, "", a); // clear the deleted portion 

     char[] chars = str.toCharArray(); 
     for (char c : chars) { 
      if (notAllowedPattern.matcher(Character.toString(c)).matches()) { 
       // not allowed; advance counter 
       offs++; 
      } else { 
       // allowed 
       super.replace(fb, offs++, 0, Character.toString(c), a); 
      } 
     } 
    } 
} 

Чтобы применить это к JTextField:

((AbstractDocument) myTextField.getDocument()).setDocumentFilter(
    new NoAlphaNumFilter()); 
+0

Я не могу использовать это для JTextField, могу ли я? –

+0

Да, вы можете. См. Мое редактирование и ссылку, которую я предоставил. – wchargin

+0

Где я должен положить этот последний код? Я поместил его в свой конструктор, но это не влияет на мой JTextField. Кроме того, я также предостерегаю бросать в '(javax.swing.text.AttributeText)', это правильно? Потому что в методе 'super.replace' он считывает требуемый параметр как' javax.swing.text.AttributeText' и находит 'javax.print.attribute.AttributeText'. –