package com.os.util;
import java.awt.Toolkit;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class MQDocument extends PlainDocument {
private String limit = null; // 输入字符限制的正则表达式
private int maxLength = -1; // 输入字符最大长度的限制,-1为不限制
private double maxValue = 0; // 如果输入的是数字,则最大值限制
private boolean isMaxValue = false; // 是否采用了最大值限制
private Toolkit toolkit = null; // 用来在错误的时候发出系统声音
private boolean beep = false; // 是否发声,true为发出声音
// 构造方法
public MQDocument() {
super();
this.init();
}
public MQDocument(Content c) {
super(c);
this.init();
}
private void init() {
toolkit = Toolkit.getDefaultToolkit();
}
// 构造方法结束
public void setCharLimit(String limit) {
this.limit = limit;
}
public String getCharLimit() {
return this.limit;
}
public void clearLimit() {
this.limit = null;
}
public boolean isOfLimit(CharSequence input) {
if (limit == null) {
return true;
} else {
return Pattern.compile(limit).matcher(input).find();
}
}
public boolean isEmptyLimit() {
if (limit == null) {
return true;
} else {
return false;
}
}
public void setMaxLength(int maxLength) {
this.maxLength = maxLength;
}
public void cancelMaxLength() {
this.maxLength = -1;
}
public void setMaxValue(double maxValue) {
this.isMaxValue = true;
this.maxValue = maxValue;
}
public boolean isMaxValue() {
return this.isMaxValue;
}
public double getMaxValue() {
return this.maxValue;
}
public void cancelMaxValue() {
this.isMaxValue = false;
this.maxValue = 0;
}
public void reset() {
clearLimit();
cancelMaxLength();
cancelMaxValue();
}
public void errorBeep(boolean beep) {
this.beep = beep;
}
public boolean isErrorBeep() {
return beep;
}
/*此方法会在JTextComponent调用setText();方法时自动调用*/
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException, NumberFormatException {
// 若字符串为空,直接返回。
if (str == null) {
return;
}
boolean b = true;
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
String temp = String.valueOf(ch[i]);
// 如果要输入的字符不在允许范围内
if (!isOfLimit(temp)) {
b = false;
}
// 如果有字符长度限制,并且现在的字符长度已经大于或等于限制
if (maxLength > -1 && this.getLength() >= maxLength) {
b = false;
}
}
// 如果内容设置了最大数字
if (isMaxValue) {
String s = this.getText(0, this.getLength()); // 文档中已有的字符
s = s.substring(0, offs) + str + s.substring(offs, s.length());
if (s.matches("^\\d*$") && Double.parseDouble(s) > maxValue) {
if (beep) {
toolkit.beep(); // 发出声音
}
return;
}
}
// 如果输入不合法
if (!b) {
if (beep) {
toolkit.beep(); // 发出声音
}
return;
}
super.insertString(offs, new String(ch), a);
}
}
class Test extends JFrame {
private static final long serialVersionUID = -2397593626990759111L;
private JPanel pane = null;
private JTextField text = null;
private MQDocument doc = null;
public Test() {
super("Test");
pane = new JPanel();
text = new JTextField(25);
doc = new MQDocument();
text.setDocument(doc);
pane.add(text);
doc.errorBeep(true); // 输入不合法时发出提示音
doc.setMaxLength(9); // 输入长度不能超过9个字符
// doc.setCharLimit("[a-zA-Z]"); // 只允许输入大小写英文字母
doc.setCharLimit("[0-9]"); // 只允许输入数字
// doc.setCharLimit("[\u4e00-\u9fa5]"); // 只允许输入中文
this.getContentPane().add(pane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 180);
this.setVisible(true);
}
public static void main(String args[]) {
new Test();
}
}
JTextField正则表达式
最新推荐文章于 2021-02-25 20:38:18 发布