2

我要做的第一件事是创建一个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?我预计默认行为是失去焦点,应用格式化程序,然后验证输入。然而,情况显然并非如此。

4

2 回答 2

0

查看 InputVerifier 的定义,听起来 GUI 工作不应该在verifyorshouldYieldFocus方法中进行。InputVerifier 仅用于决定焦点是否应该从一个字段跳转到另一个字段。

我认为您最好将一个 ActionListener 附加到您的 JFormattedTextField 上,然后在该侦听器的主体中简单地调用您的正则表达式和红色绘制代码。然后每次文本字段的内容更改时都会进行检查。

于 2013-04-24T17:51:55.080 回答
-1

将正则表达式更改为\\d{1,6},它可能不接受前导零作为数字

于 2013-04-24T17:41:31.120 回答