我要做的第一件事是创建一个适合我需要的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”。 NumberFormatter将其重新格式化为“ 000001”。但是,在此示例中,文本字段的背景仍然设置为红色。

确保JFormattedTextField的格式化内容是InputVerifier消耗的正确方法是什么?我希望默认行为是失去焦点,应用格式化程序,然后验证输入。但是,事实显然并非如此。

最佳答案

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

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

关于java - 在将格式应用于JFormattedTextField后,是否有一种方法可以强制进行验证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16198614/

10-09 06:44