Swing JFC Java

/*
Core SWING Advanced Programming 
By Kim Topley
ISBN: 0 13 083292 8       
Publisher: Prentice Hall  
*/
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
public class BoundedTextField extends JTextField implements
    BoundedPlainDocument.InsertErrorListener {
  public BoundedTextField() {
    this(null, 0, 0);
  }
  public BoundedTextField(String text, int columns, int maxLength) {
    super(null, text, columns);
    if (text != null && maxLength == 0) {
      maxLength = text.length();
    }
    BoundedPlainDocument plainDoc = (BoundedPlainDocument) getDocument();
    plainDoc.setMaxLength(maxLength);
    plainDoc.addInsertErrorListener(this);
  }
  public BoundedTextField(int columns, int maxLength) {
    this(null, columns, maxLength);
  }
  public BoundedTextField(String text, int maxLength) {
    this(text, 0, maxLength);
  }
  public void setMaxLength(int maxLength) {
    ((BoundedPlainDocument) getDocument()).setMaxLength(maxLength);
  }
  public int getMaxLength() {
    return ((BoundedPlainDocument) getDocument()).getMaxLength();
  }
  // Override to handle insertion error
  public void insertFailed(BoundedPlainDocument doc, int offset, String str,
      AttributeSet a) {
    // By default, just beep
    Toolkit.getDefaultToolkit().beep();
  }
  // Method to create default model
  protected Document createDefaultModel() {
    return new BoundedPlainDocument();
  }
  // Test code
  public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception evt) {}
  
    JFrame f = new JFrame("Bounded Text Field Example");
    BoundedTextField tf = new BoundedTextField(10, 32);
    JLabel l = new JLabel("Type up to 32 characters: ");
    f.getContentPane().add(tf, "East");
    f.getContentPane().add(l, "West");
    f.pack();
    f.setVisible(true);
  }
}
class BoundedPlainDocument extends PlainDocument {
  public BoundedPlainDocument() {
    // Default constructor - must use setMaxLength later
    this.maxLength = 0;
  }
  public BoundedPlainDocument(int maxLength) {
    this.maxLength = maxLength;
  }
  public BoundedPlainDocument(AbstractDocument.Content content, int maxLength) {
    super(content);
    if (content.length() > maxLength) {
      throw new IllegalArgumentException(
          "Initial content larger than maximum size");
    }
    this.maxLength = maxLength;
  }
  public void setMaxLength(int maxLength) {
    if (getLength() > maxLength) {
      throw new IllegalArgumentException(
          "Current content larger than new maximum size");
    }
    this.maxLength = maxLength;
  }
  public int getMaxLength() {
    return maxLength;
  }
  public void insertString(int offset, String str, AttributeSet a)
      throws BadLocationException {
    if (str == null) {
      return;
    }
    // Note: be careful here - the content always has a
    // trailing newline, which should not be counted!
    int capacity = maxLength + 1 - getContent().length();
    if (capacity >= str.length()) {
      // It all fits
      super.insertString(offset, str, a);
    } else {
      // It doesn't all fit. Add as much as we can.
      if (capacity > 0) {
        super.insertString(offset, str.substring(0, capacity), a);
      }
      // Finally, signal an error.
      if (errorListener != null) {
        errorListener.insertFailed(this, offset, str, a);
      }
    }
  }
  public void addInsertErrorListener(InsertErrorListener l) {
    if (errorListener == null) {
      errorListener = l;
      return;
    }
    throw new IllegalArgumentException(
        "InsertErrorListener already registered");
  }
  public void removeInsertErrorListener(InsertErrorListener l) {
    if (errorListener == l) {
      errorListener = null;
    }
  }
  public interface InsertErrorListener {
    public abstract void insertFailed(BoundedPlainDocument doc, int offset,
        String str, AttributeSet a);
  }
  protected InsertErrorListener errorListener; // Unicast listener
  protected int maxLength;
}