限制TextField中的文本输入

时间:2015-03-16 02:18:32

标签: java regex javafx

如何将文本输入限制为TextField,其中唯一有效的字符是数字和字母?我已经看到了很多答案,我尝试了其中一个,但由于某种原因,我无法使用退格。课程如下。

private class NoSpaceField extends TextField {

        public void replaceText(int start, int end, String text) {
            String old = getText();
            if (text.matches("[A-Za-z0-9\b]")) {
                super.replaceText(start, end, text);
            }
            if (getText().length() > 16)
                setText(old);
            positionCaret(getText().length());
        }

        public void replaceSelection(String text) {
            String old = getText();
            if (text.matches("[A-Za-z0-9\b]")) {
                super.replaceSelection(text);
            }
            if (getText().length() > 16)
                setText(old);
            positionCaret(getText().length());
        }
    }

我在RegEx上很糟糕,并且不知道如何将退格添加为有效字符。另外,我使用上面的类(稍加修改)用于不同的目的,它工作正常。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Java 8u40,则可以使用TextFormatter,i。即像这样的过滤器:

TextField textField = new TextField();

TextFormatter<String> formatter = new TextFormatter<String>( change -> {
    change.setText(change.getText().replaceAll("[^a-zA-Z0-9]", ""));
    return change; 

});
textField.setTextFormatter(formatter);

这也解决了你的问题。 G。将一些无效文本粘贴到文本字段中。

如果你是较低的jdk,那么你可能想尝试Christian Schudt的RestrictiveTextField。允许您限制字符,仍然使用光标键,退格键等

答案 1 :(得分:0)

\ b是退格符的ascii代码。您可以在正则表达式中使用它。

text.matches(&#34; [A-ZA-Z0-9 \ B]&#34)

应该做的伎俩

答案 2 :(得分:0)

通过使用空字符串调用replaceText以及表示要删除的字符位置的索引来执行删除字符。由于正则表达式与空字符串不匹配,因此将忽略删除。

您可能想要的是接受“零个或多个”有效字符。这样,您将识别空字符串,并支持多个字符的复制和粘贴。这个正则表达式看起来像

private class NoSpaceField extends TextField {

    public void replaceText(int start, int end, String text) {
        String old = getText();
        if (text.matches("[A-Za-z0-9]*")) {
            super.replaceText(start, end, text);
        }
        if (getText().length() > 16)
            setText(old);
        positionCaret(getText().length());
    }

    public void replaceSelection(String text) {
        String old = getText();
        if (text.matches("[A-Za-z0-9]*")) {
            super.replaceSelection(text);
        }
        if (getText().length() > 16)
            setText(old);
        positionCaret(getText().length());
    }
}