【问题标题】:Javafx Textfield: Accept only digits of length 8 or 11 ( phone numbers)Javafx 文本字段:仅接受长度为 8 或 11 的数字(电话号码)
【发布时间】:2020-03-13 13:23:26
【问题描述】:

使用 javafx 处理一个项目,我遇到了一个小问题。我希望我的文本字段只接受长度为 8 或 11 的数字。这是我的代码:

if(!txtPhone.getText().matches(.....) && (txtPhone.getText().length != 8 || txtPhone.getText(). length != 11){
System.out.print("Please enter a valid phone number");
}

【问题讨论】:

  • 如果满足其中一个条件,您希望显示错误消息,对吗?目前,括号中的表达式始终计算为true(在修复语法错误之后):文本长度始终不同于 8、11 或两者。这使得表达式在逻辑上等同于!txtPhone.getText().matches(.....)。您可能打算使用String text = texttPhone.getText(); if (!(((text.length() == 11) || (text.length() == 8)) && text.matches("\\d*")))(请注意,我对条件进行了一些重新排序,因为比较字符串长度比匹配正则表达式花费的时间更少。)
  • 使用 de morgan 您可以将上述评论中的条件写入!text.matches("\\d*") || (text.length() != 8 && text.length() != 11),即如果文本不只包含数字或文本长度与两个允许的长度不同,则这是一个错误.

标签: javafx textfield phone-number


【解决方案1】:

任务涉及两个阶段:

  • 您必须先创建一个仅接受数字的文本框(最多 11 个)。
  • 其次,您必须根据您的标准(8 位或 11 位)自定义用户输入

TextFormatter 用于解决问题。必须将 UnaryOperator 传递给它以仅按数字过滤用户输入,StringConverter 以验证用户输入。

这是一个示例实现:

UnaryOperator<TextFormatter.Change> filter = change -> {
    if(change.getControlNewText().matches("\\d{0,11}")) {
        return change;
    }

    return null;
};

StringConverter<String> converter = new StringConverter<String>() {
    @Override
    public String toString(String s) {
        if(s == null || s.isBlank()) return "";

        if(s.matches("\\d{8}|\\d{11}")) {
            return s;
        }

        return "";
    }

    @Override
    public String fromString(String s) {
        if(s == null || s.isBlank()) return "";

        if(s.matches("\\d{8}|\\d{11}")) {
            return s;
        }

        throw new RuntimeException("Converter error");
    }
};

textField.setTextFormatter(new TextFormatter<>(converter, null, filter));

【讨论】:

  • 谢谢@mr mcwolf。如何在一行代码中将这些放入上面的 if 语句中?
  • @JohnOmage,上面的if 运算符实际上没用。它只是在控制台中打印文本。在 GUI 的上下文中,这仅作为调试输出才有意义。如果是这样,请将跟踪消息粘贴到 StringConverter::fromString 的正文中。
  • 您似乎更有可能在继续之前通知用户他或她没有输入电话号码。因此,有几种可能的方法:禁用 OK 按钮,禁用带有相应消息的对话框关闭,或者只是显示该字段为空白的通知(图标、文本 ...)。由于没有其他信息,因此无法确切说明如何做到这一点。
【解决方案2】:

正则表达式可用于创建自定义验证。

if (txtPhone.getText().matches("\\d{8}|\\d{11}") {

    System.out.println("Its Valid Number");
    //return true;
}else {

    System.out.println("Invalid Input..!");
    //return false;
}

您可以学习和检查正则表达式Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多