JTextField中提供了一个setDocument(Document doc)的方法,利用该方法我们可以设置文本框输入特定的字符。
通常我们继承PlainDocument并重写他的insertString(int offs, String str, AttributeSet a)
offs
- 起始偏移量,该值 >= 0
str
- 要插入的字符串;
a
- 插入内容的属性
以下是继承该类所实现的两个子类代码:
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;
/**
* 自己定义的文本
* @author Administrator
*/
public class MyDocument {
/**
* 能输入小数的文本
*/
public static class DoubleOnlyDocument extends PlainDocument {
@Override
public void insertString(int offset, String s, AttributeSet attrSet) throws BadLocationException {
//获得文本框中的值
String text = this.getText(0, offset);
String reg = "\\.";
Pattern pat = Pattern.compile(reg);
Matcher mat = pat.matcher(text);
//判断文本框中是否含有小数点
boolean point = false;
if(mat.find()) {
point = true;
}
//如果偏移量不为0,并且无小数点时,如果当前输入的为小数点,则添加进文本框并返回,不进行之后的操作
if(offset != 0 && !point) {
if(s.equals(".")) {
//调用父类方法将字符插入文本框中
super.insertString(offset, s, attrSet);
return;
}
}
//将字符串解析成数字是否会抛出异常,抛出异常则说明该字符不为数字,返回,否则插入文本框中
try {
Integer.parseInt(s);
} catch (NumberFormatException ex) {
return;
}
super.insertString(offset, s, attrSet);
}
}
/**
* 只能输入数字
*/
public static class NumOnlyDocument extends PlainDocument {
@Override
public void insertString(int offset, String s, AttributeSet attrSet) throws BadLocationException {
try {
Integer.parseInt(s);
} catch (NumberFormatException ex) {
return;
}
super.insertString(offset, s, attrSet);
}
}
}
接下来通过setDoucument(new MyDocument.DoubleOnlyDocument())来控制文本框中输入的字符了。
需要注意的是:
1、如果有多个文本框时,每一个JTextField都需要设置一个自己的Document,否则某一个文本框输入值时,其他文本框的值也会改变
2、如果先设置文本框的值,再设置Document,则文本框中的值将变为空。
如:
jTextField.setText("1111");
JTextField.setDoucument(new MyDocument.NumOnlyDocument());
//此时jTextField文本框中显示出来的值就为空