Есть ли способ принудительной проверки после применения формата к 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}, вероятно, он не принимает начальные нули как числа

Другие вопросы по тегам