限制 TextField 中的文本输入

Limit Text Input in TextField

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

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 很烂,不知道如何将退格键添加为有效字符。另外,我将上面的class(略作修改)用于不同的目的,并且效果很好。

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

text.matches("[A-Za-z0-9\b]")

应该可以解决问题

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

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);

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

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

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

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

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());
    }
}