Limitação do número máximo de caracteres em um JTextField
5 respostas
M
maxcarvalho
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,
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
davidbuzatto
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
importjava.awt.*;importjavax.swing.*;importjavax.swing.text.*;publicclassTeste{publicstaticvoidmain(String[]args){JFramef=newJFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setSize(100,100);f.setLayout(newFlowLayout());// 10 colunas com 20 carateres no máximoMaxCharFieldfield=newMaxCharField(10,20);f.add(field);f.setVisible(true);}}classMaxCharFieldextendsJTextField{privateintmax;// cols = quantidade de colunas do field// max = quantidade máxima de caracterespublicMaxCharField(intcols,intmax){super(cols);this.max=max;}// sobrescreve o método createDefaultModel para usar o novo // Document criado.protectedDocumentcreateDefaultModel(){returnnewMaxCharDocument();}// documento que deixa inserir um número máximo de caracteresprivateclassMaxCharDocumentextendsPlainDocument{publicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{// se str não for null e o documento não tiver mais que "max" caracteres, // insere o novo caracterif(str!=null&&getLength()<max)super.insertString(offs,str,a);}}}
V
ViniGodoy
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
ViniGodoy
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
maxcarvalho
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á.
[]’