DocumentFilter разрешает в JTextField только числа и точку (.)?

\Вот создание JTextField:

hourlyWageInput = new JTextField("7.25");
DocumentFilter filter = new UppercaseDocumentFilter();
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter);
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER);
add(hourlyWageInput);

Вот мой DocumentFilter:

import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class UppercaseDocumentFilter extends DocumentFilter {

 public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
      String text, javax.swing.text.AttributeSet attr)

      throws BadLocationException {
           fb.insertString(offset, text.replaceAll("\\D", ""), attr);   
 }
}

Это автоматически удаляет все буквы и символы из JTextField.

Однако мне было интересно, знает ли кто-нибудь место со всеми командами, похожими на «\ D». Мне потребовалось некоторое время, чтобы найти нужную информацию.

Кроме того, код, который у меня есть сейчас, также предотвращает . от типов, которые мне нужны, так как я работаю с двойниками. Есть идеи?

Спасибо! Удивительно, как много я сегодня узнал. Я кодил 13 часов подряд.


person David Tunnell    schedule 07.08.2012    source источник
comment
Учебники Google по регулярным выражениям. Отправная точка: Учебное пособие по регулярным выражениям Oracle. Мой любимый: учебник по регулярным выражениям. Начните с самого начала, так как это довольно интенсивный материал.   -  person Hovercraft Full Of Eels    schedule 07.08.2012
comment
Какой-то забавный код у вас там. Как правило, вы должны вызывать метод сопоставления в FilterBypass, и вы, вероятно, также захотите переопределить insertString.   -  person Tom Hawtin - tackline    schedule 07.08.2012
comment
@David Tunnell Большое спасибо за эту тему.   -  person Abdul    schedule 18.03.2014


Ответы (1)


Функция replaceAll принимает регулярное выражение. Вы можете немного узнать о регулярных выражениях из многих руководств в Интернете (см. комментарий @Hovercraft Full Of Eels) или непосредственно из API Java: http://docs.oracle.com/javase/6/docs/api./java/util/regex/Pattern.html

По сути, вы можете объединить любую из конструкций регулярных выражений (перечисленных в приведенной выше ссылке), чтобы сформировать регулярное выражение. Если вы, например, хотите убедиться, что только 0-9 и . разрешены, вы можете использовать:

text.replaceAll("[^0-9.]", "")
person Nick Rippe    schedule 07.08.2012
comment
Я буду читать учебники. Спасибо за информацию, теперь программа работает. - person David Tunnell; 07.08.2012
comment
У меня возникли проблемы с поиском надежного DocumentFilter решения для подобных проблем. Мне нужно, чтобы входные данные следовали за регулярным выражением, но использование replaceAll() или аналогичного (использование Matcher для накопления совпадений и удаления несоответствий) очень ненадежно. --- Например, решение этого ответа будет очень плохим, как только пользователь введет второй '.' в TextComponent, так как это нарушит десятичную согласованность. - person XenoRo; 29.11.2012
comment
@TheLima - ваш вопрос немного отличается. Было бы полезно опубликовать его как отдельный вопрос (со ссылкой здесь), чтобы я мог дать вам полный ответ. Но в основном вам нужен более продвинутый фильтр, который определяет, использовалось ли десятичное число раньше. Просто поместите логическое поле в DocumentFilter, которое определяет, разрешает ли регулярное выражение, используемое для проверки, период или нет. - person Nick Rippe; 29.11.2012
comment
@NickRippe - ссылка здесь. Моя проблема связана, но не совсем так же, как согласованность десятичной точки, но я также не знаю, как это сделать, и это может помочь решить проблему. --- Возможно, было бы лучше опубликовать ответ о согласованности десятичной точки здесь как редактирование, а не там. - person XenoRo; 30.11.2012