You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证JFormattedTextField中是否输入完整的10位电话号码数字

验证带MaskFormatter的电话号码输入完整性

我需要验证用户在电话簿程序中是否输入了完整的10位数字来创建联系人,若未完成输入则弹出错误提示(和姓名为空时的提示一致)。但当前使用MaskFormatter("(###) ###-####")格式化电话号码输入框后,无论输入内容如何,ftf1.getText()返回的字符长度始终是14,无法直接通过长度判断是否输入了全部10位数字。


简便的验证方法

有两种直接有效的方式可以判断用户是否完成了全部数字的输入:

方法1:检查文本中是否存在占位符

MaskFormatter默认用_作为未填充位置的占位符(可通过setPlaceholderCharacter()自定义),只要输入文本中包含占位符,就说明未填完所有数字:

// 初始化时可明确设置占位符(默认即为_,此步骤可选)
format1 = new MaskFormatter("(###) ###-####");
format1.setPlaceholderCharacter('_');

// 验证逻辑
String phoneText = ftf1.getText();
boolean isPhoneComplete = !phoneText.contains("_");

方法2:提取数字后检查长度

直接过滤掉输入文本中的非数字字符,判断剩余字符长度是否为10:

String phoneText = ftf1.getText();
// 替换所有非数字字符
String digitsOnly = phoneText.replaceAll("\\D", "");
boolean isPhoneComplete = digitsOnly.length() == 10;

修改后的验证逻辑

将电话号码验证和姓名验证结合,加入到actionPerformed方法中:

@Override
public void actionPerformed(ActionEvent e) {
    TreeMap<String, String> contacts = new TreeMap<String, String>();

    if(e.getSource() == createButton) {
        boolean isNameEmpty = textField.getText().isEmpty();
        // 用方法2验证电话号码完整性
        String phoneText = ftf1.getText();
        String digitsOnly = phoneText.replaceAll("\\D", "");
        boolean isPhoneIncomplete = digitsOnly.length() != 10;

        if(isNameEmpty || isPhoneIncomplete) {
            JOptionPane.showMessageDialog(frame, "Enter Name & Phone Number.","Contact Creation", JOptionPane.ERROR_MESSAGE);
        } else {
            // 执行联系人创建逻辑
            contacts.put(textField.getText(), digitsOnly);
            message.setText("Contact created successfully!");
        }
    }
}

补充说明

  • 方法1依赖占位符设置,若自定义了占位符字符,需同步修改判断逻辑;
  • 方法2通用性更强,无论电话号码格式规则如何调整,只要需要验证10位数字就能直接使用;
  • ftf1.isEditValid()方法仅判断输入是否符合格式规则,无法识别"已输入部分数字但未填完"的情况,因此不适合用于此场景。

内容的提问来源于stack exchange,提问作者therealslyvegas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:45:30