三 JformattedTextField限制定长输入,指定某些特殊输入
我们经常会遇到比如输入IP地址,输入手机号码等定长输入的场景。这儿我们就用到了和DateFormater, NumberFormater并列的MaskFormatter, 注意: 这三种格式是并列的,所以每次只能使用一种。详见代码:
MaskFormatter formatter = new MaskFormatter("###########"); formatter.setPlaceholderCharacter('0'); JFormattedTextField ssnField = new JFormattedTextField(formatter);
setPlaceholderCharacter('0')函数的功能是: 设置一个字符,用来替代值中不存在的字符(即用户必须填充它们)。默认值为一个空格。即是在输入字符之前的替代符号。
如果要在前面显示前缀,并且输入的数字必须是1、2、3、4这四个数字,最后两位是从a、b、c中取,比如0571-41234ac, 则代码则改为:
MaskFormatter formatter = new MaskFormatter("0571-######**"); formatter.setPlaceholderCharacter('0'); formatter.setValidCharacters("12456abc"); JFormattedTextField ssnField = new JFormattedTextField(formatter);
setValidCharacters函数是指明那些是有效的字符,与其相反的还有setInvalidCharacters函数,指明哪些是不合法字符,除了不合法字符,其他都是合法字符。
在MaskFormatter格式中,有多种替代符,其中#代表数字,*可以是任何字符, 详如下:
字符 |
描述 |
---|---|
# | 任何有效数字,使用 Character.isDigit 。 |
' | 转义字符,用于避开任何具有特殊格式的字符。 |
U | 任何字符 (Character.isLetter )。将所有小写字母映射为大写。 |
L | 任何字符 (Character.isLetter )。将所有大写字母映射为小写。 |
A | 任何字符或数字(Character.isLetter 或 Character.isDigit ) |
? | 任何字符 (Character.isLetter )。 |
* | 所有字符。 |
H | 任何十六进制字符(0-9、a-f 或 A-F)。 |
四 自定义特殊格式:
引文: http://java.chinaitlab.com/others/14819.html
如果已有的NumberFormatter, DateFormatter, MaskFormatter不能满足条件,就要自己写一个Formatter, 继承DefaultFormatter类,然后重写stringToValue方法和valueToString方法,其中valueToString方法是使用 toString
方法将传入的 Object 转换为 String; stringToValue方法是通过使用带 String 参数的构造方法将传入的 String 转换为 getValueClass
的一个实例。如果 getValueClass
返回 null,将使用 JFormattedTextField
中当前值的类,例子见如下代码:
import java.text.ParseException; import java.util.StringTokenizer; import javax.swing.text.DefaultFormatter; class IPAddressFormatter extends DefaultFormatter { public String valueToString(Object value) throws ParseException { if (!(value instanceof byte[])) throw new ParseException("Not a byte[]", 0); byte[] a = (byte[]) value; if (a.length != 4) throw new ParseException("Length != 4", 0); StringBuilder builder = new StringBuilder(); for (int i = 0; i < 4; i++) { int b = a[i]; if (b < 0) b += 256; builder.append(String.valueOf(b)); if (i < 3) builder.append('.'); } return builder.toString(); } public Object stringToValue(String text) throws ParseException { StringTokenizer tokenizer = new StringTokenizer(text, "."); byte[] a = new byte[4]; for (int i = 0; i < 4; i++) { int b = 0; if (!tokenizer.hasMoreTokens()) throw new ParseException("Too few bytes", 0); try { b = Integer.parseInt(tokenizer.nextToken()); } catch (NumberFormatException e) { throw new ParseException("Not an integer", 0); } if (b < 0 || b >= 256) throw new ParseException("Byte out of range", 0); a[i] = (byte) b; } if (tokenizer.hasMoreTokens()) throw new ParseException("Too many bytes", 0); return a; } }
引文:
http://blog.sina.com.cn/s/blog_412ef3420101aoqe.html
http://java.chinaitlab.com/others/14819.html