Есть ли способ принудительной проверки после применения формата к JFormattedTextField?
Первое, что я делаю, это создаю 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
? Я ожидал, что по умолчанию будет потерян фокус, применен форматтер, а затем проверен ввод. Однако это явно не тот случай.
2 ответа
Глядя на определение InputVerifier, не похоже, что работа GUI должна происходить внутри verify
или же shouldYieldFocus
методы. InputVerifier предназначен исключительно для принятия решения о том, должен ли фокус перемещаться с одного поля на другое.
Я думаю, что вам лучше присоединить ActionListener к вашему JFormattedTextField, а затем просто вызывать ваш код регулярного выражения и красить в теле этого слушателя. Затем проверка будет выполняться каждый раз, когда изменяется содержимое текстового поля.
Измените регулярное выражение на \\d{1,6}
, вероятно, он не принимает начальные нули как числа