Algo um pouco estranho para quem vem de outras linguagem é que no swing do Java, não temos para os campos de texto(JTextField) um método para definir o número máximo de caracteres que o componente irá aceitar. Isso ocorre porque o conteúdo do do JTextField é armazenado um outro objeto normalmente um javax.swing.text.PlainDocument do qual é chamado um método toda vez que caracteres novos são inseridos dentro do JTextField.

Então se queremos limitar o número de caracteres em JTextField basta criar uma nova classe que herde o javax.swing.text.PlainDocument e sobrescreva o método insertString fazendo neste o controle. Vamos a um exemplo.

public class DocumentoLimitado extends PlainDocument{
	private int tamanhoMax = 10;
		
	public DocumentoLimitado(int tamanhoMax){
		this.tamanhoMax = tamanhoMax;
	}
	@Override
	public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {

	        if (str == null) return;  
	               
	         String stringAntiga = getText (0, getLength() );  
	         int tamanhoNovo = stringAntiga.length() + str.length(); 
	                   
	         if (tamanhoNovo <= tamanhoMax) {  
	             super.insertString(offset, str , attr);  
	         } else {    
	             super.insertString(offset, "", attr); 
	         }  
	}
}

Basicamente criamos uma nova classe que herda de javax.swing.text.PlainDocument e criamos um construtor que recebe o número máximo de caracteres aceitos.

Também sobrescrevemos o método insertString o qual será chamado toda fez que algum texto for inserido no componente. No total ele tem três parâmetros o primeiro é em qual posição do texto atual o novo texto será inserido, o segundo é o texto a ser inserido e o terceiro é os atributos do texto que não vamos utilizamos no nosso exemplo.

Na linha 10 testamos se veio algum texto para ser inserido, senão utilizamos um return para finalizar o método.

Na linha 12 pegamos o texto já presente no componente.

Na linha 13 somamos o número de caracteres do texto já presente com o número de caracteres do texto a ser inserido, para testarmos na linha 15 se este total não é maior que o máximo de caracteres estipulado na classe ou recebido no construtor. Se não for superior chamamos o método da superclasse(PlainDocument) super.insertString que irá inserir o novo texto no componente, se o número total de caracteres for maior chamamos o método super.insertString mas passamos como segundo parâmetro uma string vazia para não inserir nada( poderíamos simplesmente não chamar o método também).

Agora para limitar um JTextField basta chamar o método setDocument e passar uma instância desta classe que criamos, como no exemplo abaixo.

JTextField textField = new JTextField();
textField.setDocument( new DocumentoLimitado(15) );

Pode parecer um jeito trabalhoso de limitar um JTextField mas fazendo desta forma podemos criar limitações que só aceitem números por exemplo, ou não aceita certos caracteres especiais, etc, dá mais trabalho mas ganhamos mais controle :).

Ficamos por aqui, até a próxima