首先演示一个NumberFormatter的例子,在这个例子中要求用户输入一个数字,单击按钮后将用户输入的数字乘2以后重新赋值给输入框。用户输入的数字必须大于0,小于100。
package com.cownew.Char19;
import java.awt.Font;
import java.awt.Rectangle;
import java.math.BigDecimal;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.text.NumberFormatter;
import javax.swing.JTextField;
public class NumberFormaterDialog1 extends JDialog
{
private JPanel jContentPane = null;
private JFormattedTextField numTxtField = null;
private JButton jButton = null;
private JTextField jTextField = null;
private JFormattedTextField getNumTxtField()
{
if (numTxtField == null)
{
NumberFormatter numFormater = new NumberFormatter();
numFormater.setMaximum(new BigDecimal(100));
numFormater.setMinimum(new BigDecimal(0));
numTxtField = new JFormattedTextField(numFormater);
numTxtField.setBounds(new Rectangle(56, 38, 154, 24));
}
return numTxtField;
}
private JButton getJButton()
{
if (jButton == null)
{
jButton = new JButton();
jButton.setBounds(new Rectangle(78, 80, 81, 36));
jButton.setFont(new Font("Dialog", Font.PLAIN, 18));
jButton.setText("计算");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e)
{
BigDecimal oldValue = (BigDecimal) getNumTxtField()
.getValue();
if (oldValue != null)
{
getNumTxtField().setValue(
oldValue.multiply(new BigDecimal(2)));
}
else
{
JOptionPane.showMessageDialog(
NumberFormaterDialog1.this,"值非法");
}
}
});
}
return jButton;
}
private JTextField getJTextField()
{
if (jTextField == null)
{
jTextField = new JTextField();
jTextField.setBounds(new Rectangle(176, 83, 76, 22));
}
return jTextField;
}
public static void main(String[] args)
{
NumberFormaterDialog1 dlg = new NumberFormaterDialog1();
dlg.show();
}
public NumberFormaterDialog1()
{
super();
initialize();
}
private void initialize()
{
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane()
{
if (jContentPane == null)
{
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getNumTxtField(), null);
jContentPane.add(getJButton(), null);
jContentPane.add(getJTextField(), null);
}
return jContentPane;
}
}
当我们输入-3这个无效值的时候是允许输入的,但是当鼠标焦点移动到另外的控件的时候,“-3”就会消失。这个行为可以通过NumberFormatter 的setAllowsInvalid方法来改变:
图 17.5
图 17.6
如果输入“10”这个合法的数字,单击“计算”按钮即可算出正确的值:
图 17.7
图 17.8
案例系统中的com.cownew.ctk.ui.swing.JNumberTextField就是为了方便使用而从JFormattedTextField派生的一个数字输入控件。
DateFormatter的使用也是类似的,也允许设置最大最小值,实际上只要从InternationalFormatter派生的类,并且数据类型实现了Comparable接口都可以设置极值。
MaskFormatter允许开发人员使用掩码指定更加复杂的校验规则。掩码是一串特殊的字符串,每个字符的含义如下表所示:
字符
说明
#
匹配任何数字字符
'
转义符,用来将格式字符当成普通字符用
U
任意大写字母
L
任意小写字母
A
任意数字或者字母
?
任何字母
*
任何字符
H
任何十六进制字符 (0-9, a-f or A-F).
实例化时指定其掩码即可:
MaskFormatter formatter = new MaskFormatter("0x***");
formatter.setValidCharacters("0123456789abcdefABCDEF");
还允许为掩码设定占位符,这样可用性更好:
MaskFormatter formatter = new MaskFormatter("###-####");
formatter.setPlaceholderCharacter('_');
formatter.getDisplayValue(tf, "123");