Я использую DocumentFilter
на JTextField
, который используется для ввода количества времени, отработанного сотрудником. фильтр должен гарантировать, что предел ввода составляет всего 4 символа и разрешает только числа. Десятичное число может использоваться или не использоваться, но должно быть разрешено вводить только один раз, после ввода десятичного числа должно быть разрешено только еще одно число. Значение 9,5 или 10,5 должно быть принято, а 8,45 - нет.
На данный момент я могу получить около половины желаемого функционала. Можно ввести не более 4 символов, разрешены только цифры. Последнее достигается с помощью метода replaceAll("[^0-9.]", "")
.
Я провел много времени за просмотром руководств, чтением документации и связанными вопросами, такими как это, это и особенно это, но может похоже, регулярное выражение не работает полностью. В частности, я не могу понять, почему именно регулярное выражение [^0-9]
будет успешно разрешать только цифры, а ^\\d
не будет, если оно не заключено в класс символов, такой как [\\d]
Мой код фильтра ниже:
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TimeWorkedFilter extends DocumentFilter {
private int maxCharacters;
public TimeWorkedFilter(int maxChars) {
maxCharacters = maxChars;
}
//"[^0-9.]
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
super.insertString(fb, offs, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()
- length) <= maxCharacters)
super.replace(fb, offs, length, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
}
^
имеет особое значение внутри определения класса символов ([]
). В противном случае это просто означает начало строки/строки. - person tenub   schedule 06.05.2014