JavaFX自定义CellFactory只有十进制输入

时间:2014-03-13 14:45:45

标签: regex javafx-2 tablecell

我创建了一个自定义的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);
            }
        }
    };

3 个答案:

答案 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)。

然后你得到事件并检查字符是否是数字。如果您不希望它在输入中显示,您可以使用该事件。