Limitação do número máximo de caracteres em um JTextField

5 respostas
M

Pessoal,

Criei um form com dois JLabels e dois JTextFields no Netbeans. Não achei nas propriedades visuais dos JTextFields nada que fizesse referência ao número máximo de caracteres que podem ser digitados em
um JTextField.
Em outras palavras, como posso fazer para limitar, por exemplo, o JTextField para que apenas 8 caracteres possam ser digitados. Eu até consegui fazer isto, mas talvez não tenha sido da forma mais adequada.
Eu disparei, quando do clique de um botão chamado “Inserir”, um teste que usa o tamanho do texto digitado no JTextField, para exibir através de uma JOptionPane que o número de caracteres digitados excede o máximo permitido, sendo então o foco retornado para o componente em questão.
Acontece, porém, que desta forma ainda se permite que sejam inseridos mais caracteres que o permitidos, sendo a validação realizda apenas quando se vai gravar os dados.
Vocês não acham melhor já limitar na momento da digitação o número máximo de caracteres, ou seja, quando ainda se está com o foco no campo ?
Como posso efetuar este tipo de validação, se não encontrei nenhuma propriedade do JTextField que me permita fazer isto ?
Tem que usar uma propriedade ou método pouco documentado para se conseguir fazer isto ?
Desculpem o tamanho da mensagem, mas é que eu quis explicar bem a situação e a forma como tentei resolvê-la parcialmente, embora eu não ache que já seja a solução ideal.
Agradece a atenção,

Max Carvalho

5 Respostas

K

Cara, encontrei esse método na API, setMaximumSize(). Tenta verificar se ele faz referência ao tamanho do componente ou tamanho da quantidade de caraceres que o componente aceita…
Agora, caso realmente não exista, acho que o ideal seria gerar um evento a cara inserção de caractere no componente. Assim você consegue limitar a quantidade de caracteres que serão informados no componente…

[]'s.

D

setMaximumSize é herdado de JComponent... É o tamanho do componente e não da quantidade de carateres.

Vc pode até registrar um listener e ficar ouvindo a quantidade de carateres, mas fica meio feio...
A melhor solução é vc criar um novo Document para o seu campo.

Acabei de implementar o que você precisa, mas dá para melhorar o código :D

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class Teste {

    public static void main( String[] args ) {
        
        JFrame f = new JFrame();
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.setSize( 100, 100 );
        f.setLayout( new FlowLayout() );
        
        // 10 colunas com 20 carateres no máximo
        MaxCharField field = new MaxCharField( 10, 20 );
        f.add( field );
        
        f.setVisible( true );
        
    }
    
    
}

class MaxCharField extends JTextField {

    private int max;
    
    // cols = quantidade de colunas do field
    // max = quantidade máxima de caracteres
    public MaxCharField( int cols, int max ) {
        super( cols );
        this.max = max;
    }
    
    // sobrescreve o método createDefaultModel para usar o novo 
    // Document criado.
    protected Document createDefaultModel() {
        return new MaxCharDocument();
    }
    
    // documento que deixa inserir um número máximo de caracteres
    private class MaxCharDocument extends PlainDocument {
    
        public void insertString( int offs, String str, AttributeSet a ) 
                throws BadLocationException {
            
            // se str não for null e o documento não tiver mais que "max" caracteres, 
            // insere o novo caracter
            if ( str != null && getLength() < max )
                super.insertString( offs, str, a );
                
        }
        
    }

}
V

Oi.

Se você tivesse olhado a sessão de artigos do fórum, teria visto por lá esse artigo aqui:
Controlando um JTextField - Como limitar caracteres de um JTextField? Você vai aprender a resolver este e outros problemas neste tutorial.

Ele irá resolver o seu problema.

V

Outro comentário. No JTextField também existe um método para validação chamado setInputVerifier.

Embora não seja tão legal quanto fazer a limitação do tamanho quanto o método descrito ali no tutorial, é bom conhece-lo para fazer a validação de outros tipos de dados.

M

Pessoal,
Eu comecei a usar o fórum há bem pouco tempo. Essa área de tutoriais parece ser muito interesante.
Irei visitá-la com maior frequência.
Me parece que a construção de GUIs em Java é mais difícil de que a programação orientada a objetos propriamente dita(digo POO Avançada), envolvendo a maneira como Java a implementa os conceitos de POO e de estruturas de dados(leia-se aqui Classes Abrastratas, Interfaces, Coleções, Generics), Obrigado a todos.
Vou dar uma estudada no tutorial supracitado.
Um dia eu chego lá.
[]’

Criado 23 de fevereiro de 2008
Ultima resposta 24 de fev. de 2008
Respostas 5
Participantes 4