【问题标题】:Phone number validation in java swingjava swing中的电话号码验证
【发布时间】:2018-01-27 02:41:04
【问题描述】:

我正在 java swing 中创建一个表单,我需要验证用户确实输入了电话号码而不是“abcde”。

我是把代码放在Jbutton区域还是文本域区域?

我希望使用 try/catch 来引发异常。我的具体问题是代码去哪儿了?

【问题讨论】:

标签: java swing validation


【解决方案1】:

代码应该放在 JButton 还是 JTextField 上,这是程序员的选择。但在这两种方式中,您都必须遵循不同的想法。

1.在JButton: 如果你把你的代码放在 JButton 里面,那是最简单的。您可以使用简单的 try-catch。但它的主要缺点是您的电话号码验证将在单击该 JButton 后进行。但是用户仍然可以提供错误的输入,除非他们点击 JButton,否则他们不会收到通知。

2。使用DocumentFilter: 您可能希望在用户在文本字段中输入时实时向他们发送通知。在这种情况下,您必须使用DocumentFilter。这里是Oracle官方DocumentFilterlinklink,里面的流程描述的很清楚。

【讨论】:

    【解决方案2】:

    我建议使用DocumentFilter,它允许您在用户键入时执行实时过滤。

    下面是一个非常基本的例子,过滤掉不需要的字符并限制可以输入的字符长度

    public class PhoneNumberDocumentFilter extends DocumentFilter {
    
        protected static String[] VALID_VALUES = new String[]{"+", "-", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    
        private int maxLength = 21;
    
        public PhoneNumberDocumentFilter(int maxLength) {
            this.maxLength = maxLength;
        }
    
        public PhoneNumberDocumentFilter() {
        }
    
        protected String filter(String text) {
            StringBuilder sb = new StringBuilder();
            List<String> validValues = Arrays.asList(VALID_VALUES);
            for (int index = 0; index < text.length(); index++) {
                String value = text.substring(index, index + 1);
                if (validValues.contains(value)) {
                    sb.append(value);
                }
            }
            return sb.toString();
        }
    
        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
    
            Document doc = fb.getDocument();
            StringBuilder sb = new StringBuilder();
    
            sb.append(doc.getText(0, doc.getLength()));
            sb.insert(offset, string);
            String value = filter(string);
            if (value.length() > 0) {
                if (maxLength > 0 && doc.getLength() + value.length() <= maxLength) {
                    super.insertString(fb, offset, value, attr);
                }
            }
        }
    
        @Override
        public void replace(FilterBypass fb, int offset, int length, String text,
                        AttributeSet attrs) throws BadLocationException {
    
            Document doc = fb.getDocument();
            StringBuilder sb = new StringBuilder(2);
            sb.append(doc.getText(0, doc.getLength()));
            sb.replace(offset, offset + length, text);
    
            String value = filter(text);
            if (value.length() > 0) {
                if (sb.length() > maxLength) {
                    length = sb.length() - maxLength;
                    if (length > 0) {
                        value = value.substring(0, length);
                    }
                }
                super.replace(fb, offset, length, value, attrs);
            }
    
        }
    }
    

    它没有做的是有效的格式,我会留给你来弄清楚你如何做到这一点

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2015-02-22
      • 2021-05-22
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多