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); } } }