Javafx文本字段:仅接受长度为8或11的数字(电话号码)

Javafx文本字段:仅接受长度为8或11的数字(电话号码),javafx,textfield,phone-number,Javafx,Textfield,Phone Number,在使用javafx的项目中,我遇到了一个小问题。我希望我的文本字段只接受长度为8或11的数字。这是我的密码: if(!txtPhone.getText().matches(.....) && (txtPhone.getText().length != 8 || txtPhone.getText(). length != 11){ System.out.print("Please enter a valid phone number"); } 这项任务包括两个阶段: 您必须首先

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

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

这项任务包括两个阶段:

  • 您必须首先创建一个只接受数字的文本框(最多11位)
  • 其次,您必须根据您的标准(8或11位)自定义用户输入
是用来解决问题的。必须将A传递给它,以便仅按数字筛选用户输入并验证用户输入

这是一个示例实现:

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));
UnaryOperator筛选器=更改->{
if(change.getControlNewText().matches(“\\d{0,11}”)){
回报变化;
}
返回null;
};
StringConverter转换器=新的StringConverter(){
@凌驾
公共字符串到字符串(字符串s){
如果(s==null | | s.isBlank())返回“”;
if(s.matches(“\\d{8}\\d{11}”)){
返回s;
}
返回“”;
}
@凌驾
公共字符串fromString(字符串s){
如果(s==null | | s.isBlank())返回“”;
if(s.matches(“\\d{8}\\d{11}”)){
返回s;
}
抛出新的运行时异常(“转换器错误”);
}
};
setTextFormatter(新的TextFormatter(转换器、空值、过滤器));

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

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

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

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

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

如果满足其中一个条件,您希望显示错误消息,对吗?当前,括号中的表达式的计算结果始终为
true
(修复语法错误后):文本长度始终不同于8、11或两者。这使得表达式在逻辑上等价于
!txtPhone.getText()匹配(…)
。您可能打算使用
String text=texttPhone.getText();如果(!(((text.length()==11)| |(text.length()==8))&&text.matches(“\\d*”))
(请注意,我对条件重新排序了一点,因为比较字符串长度比匹配正则表达式花费的时间要少。)使用de morgan,您可以将上述注释中的条件写入
!text.matches(“\\d*”)| |(text.length()!=8和text.length()!=11)
,即,如果文本不包含唯一的数字,或者如果文本长度与两个允许的长度不同,则这是一个错误。谢谢@mr mcwolf。我如何将它们放入上面的if语句中,在一行代码中?@JohnOmage,上面的
if
操作符实际上是无用的。它只是在控制台中打印文本。在GUI的上下文中,这仅作为调试输出才有意义。如果是这样,请将跟踪消息粘贴到
StringConverter::fromString
的正文中。您可能更希望在继续之前通知用户他或她没有输入电话号码。因此,有几种可能的方法:禁用“确定”按钮,禁用对话框关闭并显示相应的消息,或者仅显示字段为空的通知(图标、文本…)。由于没有其他信息,因此无法确切说明如何做到这一点。