我创建了一个自定义的TableCell cellfactory。我希望它只接受十进制输入(数字和只有一个点(。))。以下是replaceText&的代码。 replaceSelection但它不允许我输入任何东西。
@Override
public void replaceText(int start, int end, String text) {
if (text.matches("/^\\d*\\.?\\d*$/")) {
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text) {
if (text.matches("/\\d*\\.?\\d*$/")) {
super.replaceSelection(text);
}
}
};
答案 0 :(得分:2)
Java正则表达不被' /'包围。根据您想要的实际行为,您需要类似
的内容final Pattern pattern = Pattern.compile("^\\d*\\.?\\d*$");
final TextField tf = new TextField() {
@Override
public void replaceText(int start, int end, String text) {
String newText = getText().substring(0, start)+text+getText().substring(end);
if (pattern.matcher(newText).matches()) {
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text) {
int start = getSelection().getStart();
int end = getSelection().getEnd();
String newText = getText().substring(0, start)+text+getText().substring(end);
if (pattern.matcher(newText).matches()) {
super.replaceSelection(text);
}
}
};
答案 1 :(得分:0)
你的正则表达式存在缺陷。它甚至可以与空字符串匹配,因为你在那里使所有东西都是可选的。
text.matches("/^\\d*\\.?\\d*$/")
所以改变它如下:
text.matches("/^\\d+(\\.\\d+)?$/")
这里表示开头的必填数字(^\\d+
),然后是((\\.\\d+)?$
)之后的可选点和数字。
答案 2 :(得分:-1)
之后您正在替换文本。我想最好不要直接更改文本并在父级上监听KeyEvent.KEY_PRESSED(使用EventFilter)。
然后你得到事件并检查字符是否是数字。如果您不希望它在输入中显示,您可以使用该事件。