JFormattedTextField在JTextField基础上增加了formatter和一个value对象。formatter可以将value转换成显示的文本,或把文本转换成value。
1、创建和初始化
rateField = new JFormattedTextField(percentFormat);
rateField.setValue(new Double(rate));
rateField.setColumns(10);
rateField.addPropertyChangeListener("value", this);
numPeriodsField = new JFormattedTextField();
numPeriodsField.setValue(new Integer(numPeriods));
numPeriodsField.setColumns(10);
numPeriodsField.addPropertyChangeListener("value", this);
paymentField = new JFormattedTextField(paymentFormat);
paymentField.setValue(new Double(payment));
paymentField.setColumns(10);
aymentField.setEditable(false);
paymentField.setForeground(Color.red);
...
percentFormat = NumberFormat.getNumberInstance();
percentFormat.setMinimumFractionDigits(2);
paymentFormat = NumberFormat.getCurrencyInstance();
以上的构造器中的使用的参数是java.text.Format,formatter使用该对象进行value和text间的转换。numPeriodsField使用一个无参的构造器,因为默认formatter会处理Integer型对象的格式化工作,但不使用于浮点型的对象。
2、设置和获得value
注意:FormattedText的value和text是两种不同的属性,而且value继text后产生。text就是文本框中实时显示的内容,所以value不一定会立刻反映最新的text值,而且在text的变化提交前,value值不会变化。
设置value值有两种方法:setValue或commitEdit。
commitEdit方法在两种情况下会被自动调用:
(1)用户在文本框中回车;
(2)文本框失去焦点。可以通过调用setFocusLostBehavior设置不同的结果。
当调用setValue方法后,value值会变成指定值,同时text会随之变化;不主张调用setText方法,因为通过该方法,text将会变化,但这个变化不会反应到value,导致text和value得不一致。
3、定制format
可以通过调用工厂类DateFormat或NumberFormat相关方法获得Format对象,或者通过实例化SimpleDateFormat获得。Formatters使用这些format对象完成value和text的转变,这些formatter一般都是InternationalFormatter的子类(除MaskFormatter外),如DateFormatter、NumberFormatter。
4、使用MaskFormatter
该formatter能严格明确文本框的某个位置哪些字符有效。
zipField = new JFormattedTextField(
createFormatter("#####"));
...
protected MaskFormatter createFormatter(String s) {
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter(s);
} catch (java.text.ParseException exc) {
System.err.println("formatter is bad: " + exc.getMessage());
System.exit(-1);
}
return formatter;
}
Character | Description |
---|---|
# | Any valid number (Character.isDigit
). |
'
(single quote) | Escape character, used to escape any of the special formatting characters. |
U | Any character (Character.isLetter
). All
lowercase letters are mapped to uppercase. |
L | Any character (Character.isLetter
). All
uppercase letters are mapped to lowercase. |
A | Any character or number (Character.isLetter
or Character.isDigit
). |
? | Any character
(Character.isLetter
). |
* | Anything. |
H | Any hex character (0-9, a-f or A-F). |
5、定制formatter和使用formatter工厂
使用formatter时牢记formater最好和JFormattedTextField一一关联。可以通过以下方式设置JFormattedTextField使用的formatter:
(1)使用JFormattedTextField带Format参数的构造函数;
(2)使用JFormattedTextField带JFormattedTextField.AbstractFormatter参数的构造函数;
(3)对一个尚且没有设置format、formatter、formatterFactory的JFormattedTextField调用setValue方法,然后根据value的类型由默认的format factory给该文本框分配一个合适的formatter。
(4)为JFormattedTextField设置formatter factory,可以通过构造器或setFormatterFactory,由该factory返回相应的formatter,这种方式最灵活。