使用正则表达式限制swing (JTextField等) 的输入

摘要:
之前使用Qt编写Gui程序的时候,可以直接使用正则表达式限制所有输入框,非常方便。这段时间要做一份课程设计,使用java编写,ui要限制输入,比如只能输入x位数字,输入身份证等。百度了许多资料,发现了一个JFormattedTextField的类可以规范输入。其实输入框都会提供一个setDocument的方法以规范输入,所以我决定自己写一个类来实现正则表达式。代码:importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.text.AttributeSet;importjavax.swing.text.BadLocationException;importjavax.swing.text.PlainDocument;publicclassMyRegExpextendsPlainDocument{privatePatternpattern;privateMatcherm;publicMyRegExp{super();this.pattern=Pattern.compile;}@OverridepublicvoidinsertStringthrowsBadLocationException{if{return;}Stringtmp=getText.concat;m=pattern.matcher;ifsuper.insertString;}}OK,接下来就是调用,方法非常简单,比如我想限制只能输入最多两位小数:JTextFieldtextFiled=newJTextFiled();textFiled.setDocument(newMyRegExp("\d*(\.\d{0,2})?

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

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

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

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

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

代码:

importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

importjavax.swing.text.AttributeSet;
importjavax.swing.text.BadLocationException;
importjavax.swing.text.PlainDocument;

public class MyRegExp extendsPlainDocument {
    privatePattern pattern;
    privateMatcher m;
    publicMyRegExp(String pat)
    {
        super();
        this.pattern=Pattern.compile(pat);
    }
    @Override
    public voidinsertString
    (intoffset, String str, AttributeSet attr)
            throwsBadLocationException {   
        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=newJTextFiled();
textFiled.setDocument(new MyRegExp("\d*(\.\d{0,2})?"));

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

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

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

免责声明:文章转载自《使用正则表达式限制swing (JTextField等) 的输入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于OpenAM系列的SSO----基础地图标注下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

自学Zabbix8.1 Regular expressions 正则表达式

点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix8.1 Regular expressions 正则表达式1. 配置 点击Administration >>General>>右侧下拉表选择“ Regular expressions”>>New regu...

shell 正则表达式与文件名匹配

1) . : 匹配任意单ASCII 字符,可以为字母,或为数字。 2) 举例: ..XC..匹配deXC1t、23XCdf 等,.w..w..w.匹配rwxrw-rw-行首以^匹配字符串或字符序列 1) ^ : 允许在一行的开始匹配字符或单词。 2) 举例: ^.01 匹配0011cx4、c01sdf 等,^d 匹配drwxr-xr-x、drw-r--r-...

转载(正则表达式的分类) 规格严格

正则引擎主要可以分为两大类:一种是DFA,一种是NFA。这两种引擎都有了很久的历史(至今二十多年),当中也由这两种引擎产生了很多变体!于是POSIX的出台产生规范了不必要变体的继续产生。这样一来,目前的主流正则引擎又分为3类:一、DFA,二、传统型NFA,三、POSIX NFA。 DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同...

swing界面刷新问题

在Java Swing编程中,往往会遇到需要动态刷新界面的时候,例如动态刷新JLabel的文本,JTextField里的文本等等。但是往往却没有达到我们预期的效果,我相信很多朋友都遇到过本文将要说的这个问题。 如下图的Swing界面中,我们期望在点击按钮时,Jlabel和JTextField里的文本能不断的变化,并实时地显示出来。 这个例子中,我们期望点...

Vs 正则表达式 查找替换 微软权威参考

查找:Load\(\"Sql模板名称[^\"]+ 替换:\0_操作名 说明: 将形式如下的字符串替换 Load("Sql模板名称") Load("Sql模板名") 为 Load("Sql模板名称_操作名") Load("Sql模板名") ********************************************* 查找:{Load\(\"Sq...

Aviator

Aviator简介¶Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby的笨重,Aviator非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然,...