本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

使用 JOptionPane 进行数据验证

发布于2021-10-16 09:37     阅读(255)     评论(0)     点赞(28)     收藏(2)


我想在 JOptionPane 时执行数据验证。我找到了以下方法,但我对它并不满意

import javax.swing.*;
import java.util.regex.*;

public class ValidateJOptionPane {
        public static void main(String[] args) {
        String input = JOptionPane.showInputDialog("Enter number: ");
                Pattern p = Pattern.compile("[A-Z,a-z,&%$#@!()*^]");
                Matcher m = p.matcher(input);
                if (m.find()) {
             JOptionPane.showMessageDialog(null, "Please enter only numbers");
                }
        }
}

使用正则表达式来检测可以输入的字符而不是测试无法输入的字符会更好、更明智。

有没有更好更简单的方法来使用 JOptionPane 进行数据验证?. 我觉得正则表达式在这里过大了。如果我错了,请纠正我:P

PS我是Java初学者


解决方案


长答案是使用DocumentFilter,请参阅实现文档过滤器文档过滤器示例以获取更多详细信息。

问题是,您需要控制,您不能依赖 提供的“简单”、“助手”功能JOptionPane.showInputDialog,因为您需要访问用于提示用户的文本字段...

例如...

过滤器输入

以下示例使用PatternFilter来自DocumentFilter 示例的(稍微)修改版本

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class ValidateTest {

    public static void main(String[] args) {
        JTextField field = new JTextField(20);
        Pattern p = Pattern.compile("[0-9]+");
        ((AbstractDocument) field.getDocument()).setDocumentFilter(new PatternFilter(p));
        int option = ask("Enter number:", field);
        if (option == JOptionPane.OK_OPTION) {
            System.out.println("You have entered " + field.getText());
        }
    }

    public static int ask(String label, JComponent comp) {

        JPanel panel = new JPanel();
        panel.add(new JLabel(label));
        panel.add(comp);

        return JOptionPane.showOptionDialog(null, panel, label, 
                        JOptionPane.OK_CANCEL_OPTION, 
                        JOptionPane.QUESTION_MESSAGE, null, null, null);

    }

    public static class PatternFilter extends DocumentFilter {

        // Useful for every kind of input validation !
        // this is the insert pattern
        // The pattern must contain all subpatterns so we can enter characters into a text component !
        private Pattern pattern;

        public PatternFilter(Pattern p) {
            pattern = p;
        }

        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
                        throws BadLocationException {

            String newStr = fb.getDocument().getText(0, fb.getDocument().getLength()) + string;
            Matcher m = pattern.matcher(newStr);
            if (m.matches()) {
                super.insertString(fb, offset, string, attr);
            } else {
            }
        }

        public void replace(FilterBypass fb, int offset,
                        int length, String string, AttributeSet attr) throws
                        BadLocationException {

            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }

}

现在,通过一些巧妙的设计,您可以编写一个简单的辅助类,它在内部构建了所有这些,并提供了一个漂亮的askFor(String label, Pattern p)样式方法,可以返回一个String(或者null如果用户取消操作)



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/303954/fc9ffe0b83cc49d154ab/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)