JTextField正则表达式

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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值