利用Document构造JTextField:

利用Document构造JTextField:

Document是一个interface,主要的功能是定义一些方法,让我们在使用所有与Text相关的组件时,能够将输入文字的内容加以 结构化或规格化。将文字内容结构化又是什么呢?举例来说,就好像一本书的内容,它的结构一定会有各个大章,在各章中又会分 成许多小节,小节内会再有各个小重点等等,这样的树状组件结构就是结构化的一种。由于这个interface定义了10几个方法,但是 在这里我们所会用到的只有少数几个方法,为了不让大家混淆,因此我们先列出这个interface常被使用到的方法,有兴趣的可查阅 java api文件:

  • void addDocumentListener(DocumentListener listener):增加DocumentListener,使组件具有处理DocumentEvent功能。
  • void addUndoableEditListener(UndoableEditListener listener):增加UndoableEditListener,使组件具有处理UndoableEditEv Ent功能,当文件中的内容被修改时自动记忆可以被复原的内容。
  • String getText(int offset,int length):取得document中的文字内容。
  • void insertString(int offset,String str,AttributeSet a):将字符串加入到Text组件的内容中。
  • void removeDocumentListener(DocumentListener listener):移除DocumentListener.
  • void removeUndoableEditListener(UndoableEditListener listener):移除UndoableEditListener,使复原功能失效。

还记得我们一开始在介绍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的模式结构均是相同的。我们来看下面的范例:

JTextField3.java
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);
			}
		});
	}
}
JTextField3_FixedLengthDocument.java
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);
		}
	}
}

你可能感兴趣的:(document,JTextField)