zoukankan      html  css  js  c++  java
  • 使用正则表达式限制swing (JTextField等) 的输入

    之前使用Qt编写Gui程序的时候,可以直接使用正则表达式限制所有输入框,非常方便。

    这段时间要做一份课程设计,使用java编写,ui要限制输入,比如只能输入x位数字,输入身份证等。

    百度了许多资料,发现了一个 JFormattedTextField 的类可以规范输入。

    刚开始试用觉得还不错,后来发现一个严重的问题:如果光标不是从最左边插入的话,那么左边的位置就会被空格占满,影响输入。

    其实输入框都会提供一个 setDocument 的方法以规范输入,所以我决定自己写一个类来实现正则表达式。

    代码:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
    
    public class MyRegExp extends PlainDocument {
        private Pattern pattern;
        private Matcher m;
        public MyRegExp(String pat)
        {
            super();
            this.pattern=Pattern.compile(pat);
        }
        @Override
        public void insertString
        (int offset, String str, AttributeSet attr)
                throws BadLocationException {   
            if (str == null){
                return;
            }
            String tmp=getText(0, offset).concat(str);
            m=pattern.matcher(tmp);
            if(m.matches())
                super.insertString(offset, str, attr);
        }
    }

     

    OK,接下来就是调用,方法非常简单,比如我想限制只能输入最多两位小数:

    JTextField textFiled=new JTextFiled();
    textFiled.setDocument(new MyRegExp("\d*(\.\d{0,2})?"));

     这个方法也同时适用于粘贴操作。也可以用于其他拥有setDocument的类,如JPasswordField

    但是有一点必须注意,限制输入范围必须从0开始,不能强行限制位数,例如 new MyRegExp("\d{2,2}") 是不行的

     

     转载请注明出处:http://www.cnblogs.com/ztzheng/p/3639056.html

     

  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/ztzheng/p/3639056.html
Copyright © 2011-2022 走看看