Первое, что я делаю, это создаю NumberFormat
, который соответствует моим потребностям:
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
? Я ожидал, что поведение по умолчанию будет заключаться в том, что фокус будет потерян, форматтер будет применен, а затем будет проверен ввод. Однако это явно не так.