Первое, что я сделать, это создать NumberFormat
, который соответствует моим потребностям:Есть ли способ принудительного подтверждения после применения формата к JFormattedTextField?
this.format = NumberFormat.getIntegerInstance();
this.format.setMinimumIntegerDigits(6);
this.format.setMaximumIntegerDigits(6);
this.format.setGroupingUsed(false);
я применить его к JFormattedTextField:
this.fld_id = new JFormattedTextField(this.format);
Затем я этого поля InputVerifier
, например, так:
this.fld_id.setInputVerifier(new IdVerifier());
Мой IdVerifier
просто смотрит, чтобы увидеть, что введенный текст соответствует регулярным выражение:
private class IdVerifier extends InputVerifier {
public boolean verify(final JComponent arg0) {
final JFormattedTextField verifyJTF = (JFormattedTextField) arg0;
if (!verifyJTF.getText().matches("\\d{6}")) {
return false;
}
return true;
}
public boolean shouldYieldFocus(final JComponent arg0) {
if (!this.verify(arg0)) {
arg0.setBackground(Color.RED);
} else {
arg0.setBackground(UIManager.getColor("TextField.background"));
}
return true;
}
}
Однако, когда я делаю это, я ввожу значение в JFormattedTextField
, скажем, «1». Это переформатируется на «000001» на NumberFormatter
. Однако в этом примере фон текстового поля по-прежнему установлен на красный.
Каков правильный способ гарантировать, что отформатированное содержимое JFormattedTextField
- это то, что потребляется InputVerifier
? Я ожидал, что поведение по умолчанию заключается в том, что фокус потерян, применяется форматирование, после чего ввод проверяется. Однако это явно не так.
Прошло много времени с тех пор, как я выполнил работу с графическим интерфейсом, но [учебники по Oracle предлагают сделать это по-моему) (http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html) , вот почему я это сделал. В разделе «Проверка ввода» они вызывают звуковой сигнал в методе 'shouldYieldFocus()'. Я не вижу разницы между изменением цвета поля и звуком. Это может быть плохой пример в учебниках, но я не вижу, как перемещение фона с метода 'verify()' в метод 'shouldYieldFocus()' решит что угодно. –
Да, также прочитайте это сейчас, мое плохое - возможно, это связано с регулярным epxression ... прочитайте мою обновленную запись. –
Это меняет смысл моего регулярного выражения. Вероятно, это будет работать из-за форматирования, но я не хочу полагаться на присутствующий форматтер. {1,6} означает не менее 1, но не более 6 раз - единственный действительный вход - ровно 6 цифр. –