Mega Code Archive

 
Categories / Java / Swing JFC
 

Bounded TextField

/* 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; }