首先演示一個NumberFormatter的例子,在這個例子中要求用戶輸入一個數(shù)字,單擊按鈕后將用戶輸入的數(shù)字乘2以后重新賦值給輸入框。用戶輸入的數(shù)字必須大于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("計(jì)算");
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;
}
}
當(dāng)我們輸入-3這個無效值的時候是允許輸入的,但是當(dāng)鼠標(biāo)焦點(diǎn)移動到另外的控件的時候,“-3”就會消失。這個行為可以通過NumberFormatter 的setAllowsInvalid方法來改變:
圖 17.5
圖 17.6
如果輸入“10”這個合法的數(shù)字,單擊“計(jì)算”按鈕即可算出正確的值:
圖 17.7
圖 17.8
案例系統(tǒng)中的com.cownew.ctk.ui.swing.JNumberTextField就是為了方便使用而從JFormattedTextField派生的一個數(shù)字輸入控件。
DateFormatter的使用也是類似的,也允許設(shè)置最大最小值,實(shí)際上只要從InternationalFormatter派生的類,并且數(shù)據(jù)類型實(shí)現(xiàn)了Comparable接口都可以設(shè)置極值。
MaskFormatter允許開發(fā)人員使用掩碼指定更加復(fù)雜的校驗(yàn)規(guī)則。掩碼是一串特殊的字符串,每個字符的含義如下表所示:
字符
說明
#
匹配任何數(shù)字字符
'
轉(zhuǎn)義符,用來將格式字符當(dāng)成普通字符用
U
任意大寫字母
L
任意小寫字母
A
任意數(shù)字或者字母
?
任何字母
*
任何字符
H
任何十六進(jìn)制字符 (0-9, a-f or A-F).
實(shí)例化時指定其掩碼即可:
MaskFormatter formatter = new MaskFormatter("0x***");
formatter.setValidCharacters("0123456789abcdefABCDEF");
還允許為掩碼設(shè)定占位符,這樣可用性更好:
MaskFormatter formatter = new MaskFormatter("###-####");
formatter.setPlaceholderCharacter('_');
formatter.getDisplayValue(tf, "123");