import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.Box;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;
public class Text {
public static void main(String args[]) throws Exception {
Box form = Box.createVerticalBox();
form.add(new JLabel("Name;"));
form.add(new JTextField("Joe User"));
form.add(new JLabel("Birthiday:"));
JFormattedTextField birthdayField =
new JFormattedTextField(new SimpleDateFormat("mm/dd/yy"));
birthdayField.setValue(new Date());
form.add(birthdayField);
form.add(new JLabel("Age:"));
form.add(new JFormattedTextField(new Integer(32)));
form.add(new JLabel("Hairs on Body:"));
JFormattedTextField hairsField =
new JFormattedTextField(new DecimalFormat("###,###"));
hairsField.setValue(new Integer(100000));
form.add(hairsField);
form.add(new JLabel("Phone Number:"));
JFormattedTextField phoneField =
new JFormattedTextField(new MaskFormatter("(###)###-####"));
phoneField.setValue("(314)555-1212");
form.add(phoneField);
JFrame frame = new JFrame("User Information");
frame.getContentPane().add(form);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
过滤输入
以下例子为JTextField应用了一个文档过滤器,将所有输入都改为大写。代码如下:
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class DocFilter {
public static void main(String[] args) {
JTextField field = new JTextField(30);
//设置过滤器
((AbstractDocument)(field.getDocument())).setDocumentFilter(
new DocumentFilter(){
//填写数据时,所有字母改为大写
public void insertString(FilterBypass fb,
int offset,
String string,
AttributeSet attr)throws BadLocationException{
fb.insertString(offset,string.toUpperCase(),attr);
}
//修改数据时,所有字母改为大写
public void replace(DocumentFilter.FilterBypass fb,
int offset,
int length,
String string,
AttributeSet attr) throws BadLocationException{
fb.replace(offset,length,string.toUpperCase(), attr);
}
});
JFrame frame = new JFrame("User Information");
frame.getContentPane().add(field);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
当文本增加到文档或有所修改时,将调用DocumentFilter的方法insertString()和replace()。在这些方法中则有机会在继续传递文本前对其过滤。当已经准备好应用文本时,则使用FilterBypass引用。FilterBypass有同样的方法,它将把修改直接应用到文档中。DocumentFilter remove()方法可以用于截取删除文档字符的编辑命令。
对于这个例子,有一点需要指出,即并非所有Document都有一个setDocumentFilter()方法。我们必须将文档类型强制转换为AbstractDocument。只有扩展了AbstractDocument的文档实现才接受过滤器。这是因为在Java1.4中增加了文档过滤API,但认为不能对原来的Document接口做出修改。
密码输入框
JPasswordField仅用于输入密码,它是JTextField的子类,使用与JTextField完全相同,只不过所键入的每个字符都显示为用一个字符,通常是星号,可以使用setEchoChar()方法来设置JPasswordField使用另一个字符。
可以使用getText()来得到所键入的密码,但已被废弃。取而代之的是getPassword()方法。getPassword()方法返回一个字符数组,而不是一个String对象。因为对于窥探内存的密码窃听器,字符数组没有String那么脆弱。要注意,在Java密码类中,其方法均接受字符数组类型的密码而不是String,因此可以直接将getPassword()调用结果传递给密码类而无需创建一个String。