我要做的第一件事是创建一个适合我需要的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
消耗的正确方法是什么?我期望默认行为是焦点丢失,应用格式化程序,然后验证输入。然而,事实显然并非如此。
答案 0 :(得分:0)
查看InputVerifier的定义,听起来不应该在verify
或shouldYieldFocus
方法中进行GUI工作。 InputVerifier仅用于决定焦点是否应从一个字段跳到另一个字段。
我认为你最好将ActionListener附加到你的JFormattedTextField,然后简单地在那个监听器的主体中调用你的正则表达式和红色绘画代码。然后每次文本字段的内容发生变化时都会进行检查。
答案 1 :(得分:-1)
将正则表达式更改为\\d{1,6}
,它可能不接受前导零作为数字