【问题标题】:Limit Text Input in TextField限制 TextField 中的文本输入
【发布时间】:2015-03-16 02:18:32
【问题描述】:

如何将文本输入到 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());
        }
    }

我在正则表达式方面很糟糕,并且不知道如何将退格添加为有效字符。另外,我将上述类(稍作修改)用于不同的目的,并且效果很好。

【问题讨论】:

  • 你看过这个帖子吗,stackoverflow.com/questions/17438100/…
  • @chris85 我试过[A-Za-z0-9\b],但没有做任何事情,增加反斜杠的数量只会引发 PatternSyntaxException 或没有做任何事情。

标签: java regex javafx


【解决方案1】:

如果您使用的是 Java 8u40,则可以使用 TextFormatter,即。 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。允许您限制字符并仍然使用光标键、退格键等。

【讨论】:

  • 有趣;我还没有看到这个。另外,有没有办法限制可以输入的字符数?
  • 检查文本格式化程序处理程序中更改文本的长度,如果文本太长,请修改它。但是,使用额外的 ChangeListener 来限制字符数可能更容易实现。
【解决方案2】:

通过使用空字符串和表示要删除的字符位置的索引调用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());
    }
}

【讨论】:

    【解决方案3】:

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

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

    应该做的伎俩

    【讨论】:

    • 我试过了,还是不行;我不知道为什么。我没有在任何地方添加任何事件处理程序,但我根本不能使用退格键。删除字符的唯一方法是选择几个并使用另一个字符。
    • 你运行了哪些测试,得到了什么输出?问题可能不在于正则表达式。每次更改字符时都会调用replaceText 方法吗?结果是否可能在代码的其他地方被覆盖?
    • 完整课程可以在here找到。我只是使用 Eclipse 来运行 main 方法,并通过在应用程序的 Username 框中输入文本来进行测试。
    • 看起来您正在调用一个新的 NoSpaceField 对象,但没有使用您包含的方法来限制用户文本,或者至少我在提供的类中的任何地方都看不到这个。
    • JavaFX 在处理输入时使用这些方法。我在另一个较小的程序中做了完全相同的事情,而且效果很好。
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2012-09-06
    • 2022-11-30
    • 2015-01-31
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多