java - 在将格式应用到 JFormattedTextField 后是否有强制验证的方法?

标签 java swing jformattedtextfield numberformatter inputverifier

我做的第一件事是创建一个适合我需要的 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 的定义,听起来 GUI 工作不应该在 verifyshouldYieldFocus 方法中进行。 InputVerifier 仅用于决定焦点是否应从一个字段跳到另一个字段。

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

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

相关文章:

java - 如何防止在 JFormattedTextField 中输入 '.' 字符

java - 如何在没有 Eclipse 或任何其他 IDE 的情况下配置 drools

java - 如何在 JLabel 上绘图?

java - 在 Java Swing 中为特定组件设置 Tooltip 延迟时间

java - 如何将 "formatted double(String)"转换为 double?

java - JFormattedTextField 与 MaskFormatter 和 DateFormat

java - 无法将 类型的对象转换为 JMS 消息。支持的消息有效负载为 : String, 字节数组、Map<String,?>、可序列化对象

java - 如何在不继承 'spring-boot-starter-parent' 模块的情况下测试我的 Spring-Boot 应用程序?

java - 使用 ID 而不是 DATE 列有什么缺点吗?

Java:JTable自动主键更新