
//Title:
//Version:
//Copyright:    Copyright (c) 1999
//Author:       NilNilNil
//Company:
//      Objective: Limitar o numero de caracteres em um JTextField

import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;

public class PanelTextFieldLimited extends JPanel
{
    JTextField textFieldLimitado = new JTextField();
    JLabel labelTextLimitado = new JLabel();

    public PanelTextFieldLimited()
    {
        try
        {
            jbInit();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    private void jbInit() throws Exception
    {
        this.setLayout(null);
        this.setPreferredSize(new Dimension(375, 100));
        execucoesIniciais();
        labelTextLimitado.setText("Tente digitar mais que 3 (tres) caracteres...");
        labelTextLimitado.setHorizontalAlignment(SwingConstants.RIGHT);
        labelTextLimitado.setBounds(new Rectangle(0, 19, 282, 17));
        textFieldLimitado.setBounds(new Rectangle(292, 17, 63, 21));
        this.add(textFieldLimitado, null);
        this.add(labelTextLimitado, null);
    }

    private void execucoesIniciais()
    {
        textFieldLimitado.setDocument(new LimitDocument(3));
    }

    public class LimitDocument extends PlainDocument
    {
        private int limit;

        public LimitDocument(int limit)
        {
            super();
            setLimit(limit); // store the limit
        }

        public final int getLimit()
        {
            return limit;
        }

        public void insertString(int offset, String s, AttributeSet attributeSet)
                throws BadLocationException
        {
            if(offset < limit) // if we haven't reached the limit, insert the string
            {
                super.insertString(offset,s,attributeSet);
            } // otherwise, just lose the string
        }

        public final void setLimit(int newValue)
        {
            this.limit = newValue;
        }
    }

    public static void main(String[] argv)
    {
        JFrame f = new JFrame();
        PanelTextFieldLimited p = new PanelTextFieldLimited();

        f.getContentPane().add(p);
        f.pack();
        f.setVisible(true);
    }
}