利用Document构造JTextField:

来源:互联网 发布:今年好听的网络歌曲 编辑:程序博客网 时间:2024/05/01 21:36

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