Document是一个interface,主要的功能是定义一些方法,让我们在使用所有与Text相关的组件时,能够将输入文字的内容加以 结构化或规格化。将文字内容结构化又是什么呢?举例来说,就好像一本书的内容,它的结构一定会有各个大章,在各章中又会分 成许多小节,小节内会再有各个小重点等等,这样的树状组件结构就是结构化的一种。由于这个interface定义了10几个方法,但是 在这里我们所会用到的只有少数几个方法,为了不让大家混淆,因此我们先列出这个interface常被使用到的方法,有兴趣的可查阅 java api文件:
还记得我们一开始在介绍JTextField时所提到的构造函数吗?其中有一个JTextField的构造函数是这样子的:
JTextField(Document doc,String text,int columns):使用指定的文件存储模式建立一个新的JTextField并设置其初始 化字符串和字段长度。
因此我们必须实作Document所有的方法,才能利用Document构造出JTextField,这样的做法有点麻烦,因为我们之前有提到Document 的方法有数十种,但是我们要用到的却只有其中几种,若是要将全部的方法实作那是相当费时的做法。大家还记行我们前几章介绍 JList时,利用继承AbstractListModel的抽象类来构造JList吗?由于抽象类已经了许多接口的方法,所以当我们继承这个抽象类后 便不需要实作这些方法。同样的java在这里也提供了一个AbstractDocument的抽象类来供我们使用。不过在这里我们并不是要使用 AbstractDocument,因为java在这部份已经提供了一个实体类:PlainDocument.这个实体类继承AbstractDocument,也就是具备了所 有AbstractDocument的方法,所以我们只要直接继承PlainDocument这个实体类就能利用Document来构造JTextField.这种概念跟 JList或是JTable的模式结构均是相同的。我们来看下面的范例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextField3 {
public static void main(String args[]) {
JFrame f = new JFrame("JTextField3");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
// p1.setLayout(new GridLayout(4,2));
p1.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST; // 设定Layout的位置
gbc.insets = new Insets(2, 2, 2, 2); // 设定与边界的距离(上,左,下,右)
p1.setBorder(BorderFactory.createTitledBorder("您的基本数据"));
JLabel l1 = new JLabel("姓名:");
JLabel l2 = new JLabel("性别:");
JLabel l3 = new JLabel("身高:");
JLabel l4 = new JLabel("体重:");
JTextField t1 = new JTextField(new JTextField3_FixedLengthDocument(10),
"", 10);
JTextField t2 = new JTextField(new JTextField3_FixedLengthDocument(1),
"", 2);
JTextField t3 = new JTextField(new JTextField3_FixedLengthDocument(5),
"", 5);
JTextField t4 = new JTextField(new JTextField3_FixedLengthDocument(5),
"", 5);
gbc.gridy = 1;
gbc.gridx = 0;
p1.add(l1, gbc);
gbc.gridx = 1;
p1.add(t1, gbc);
gbc.gridy = 2;
gbc.gridx = 0;
p1.add(l2, gbc);
gbc.gridx = 1;
p1.add(t2, gbc);
gbc.gridy = 3;
gbc.gridx = 0;
p1.add(l3, gbc);
gbc.gridx = 1;
p1.add(t3, gbc);
gbc.gridy = 4;
gbc.gridx = 0;
p1.add(l4, gbc);
gbc.gridx = 1;
p1.add(t4, gbc);
contentPane.add(p1);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
import javax.swing.*;
import javax.swing.text.*;
import java.awt.Toolkit;
public class JTextField3_FixedLengthDocument extends PlainDocument {
private int maxLength;
public JTextField3_FixedLengthDocument(int maxLength) {
this.maxLength = maxLength;
}
public void insertString(int offset, String str, AttributeSet att)
throws BadLocationException {
if (getLength() + str.length() > maxLength) {
Toolkit.getDefaultToolkit().beep();
} else {
super.insertString(offset, str, att);
}
}
}