lishankang

博客园 首页 新随笔 联系 订阅 管理

三  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.isLetterCharacter.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

 

 

posted on 2013-03-15 11:21  havedrop  阅读(769)  评论(0编辑  收藏  举报