Eu implementei a classe LengthLimitedField que faz exatamente isso. Eu
usei como base um exemplo do Java Tutorial.

De uma olhada no programa em anexo.
                                                                                       
                                                     

Carlos Daniel Chacur Alves wrote:
> 
> Caros colegas,
> 
>     Estou implementando uma variação de JTextFields que aceitam no
> máximo n caracteres digitados. Contudo, estou tendo problemas
> com relação à utilização do método consume()  no método keyPressed (a
> classe que estou escrevendo estende JTextField e implementa
> a interface KeyListener). O fato é que os caracteres que excedem o
> limite continuam a aparecer (o mesmo não acontece quando utilizo
> TextField
> em vez de JTextField). O trecho do código a que me refiro é o seguinte:
> 
>     if ((key == KeyEvent.VK_TAB) || (key == KeyEvent.VK_ENTER)) {
>          ((Component) (e.getSource())).transferFocus();
>      }
>      else if ((key != KeyEvent.VK_LEFT) && (key !=
> KeyEvent.VK_BACK_SPACE) && (super.getText().length() > maxLength)) {
>          e.consume();  // Não está tendo o comportamento desejado!!!!
>         .
>         .
>         .
>      }
> 
>     Alguém tem uma sugestão para a solução desse problema?
> 
>     Obrigado desde já,
> 
>                 Carlos Daniel
> 
>     --------------------------- LISTA SOUJAVA ---------------------------
>     http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
>     [para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
>     ---------------------------------------------------------------------

--
Eduardo Issao Ito <[EMAIL PROTECTED]>
Eurosoft Consultoria <http://www.euroconsult.com.br>
Rua Marina Saddi Haidar, 176 - São Paulo - SP - Brasil
CEP 04650-050
TEL: +55 11 524-8022
FAX: +55 11 524-0408
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;


public class LengthLimitedField extends JTextField {

  private int thisLen = 0;
  private int maxLen = Integer.MAX_VALUE;

  public LengthLimitedField () {
      super();
  }

    public LengthLimitedField(int cols, int maxLen) {
        super(cols);
        this.maxLen = maxLen;
    }

    public LengthLimitedField(int maxLen) {
        super(0);
        this.maxLen = maxLen;
    }

    protected Document createDefaultModel() {
        return new LengthLimitedDocument();
    }

    class LengthLimitedDocument extends PlainDocument {
        public void insertString(int offs, String str, AttributeSet a) throws 
BadLocationException {
            if (str == null || thisLen >= maxLen)
                return;
            if (thisLen + str.length() > maxLen)
                str = str.substring(0,maxLen - thisLen);
            thisLen += str.length();
            super.insertString(offs, str, a);
        }
        public void remove(int offs, int len)  throws BadLocationException {
            thisLen -= len;
            super.remove(offs, len);
        }
    }

}

Responder a