Estendendo e customizando o JTextField
Publicado em 11/12/2012

Testando os componentes
Muitas vezes precisamos criar restrições em formulários para evitar que o usuário coloque dados incoerente e tenhamos que ficar validando depois. O mundo perfeito seria se os componentes já viessem com recursos de validação, mas pelo menos no JTextField padrão do Swing isso não acontece.
Esse projeto que estou disponibilizando é um pacote com alguns componentes personalizados estendidos a partir do JTextField. São três componentes e suas características são descritas abaixo.
JDoubleField
Campo que aceita somente números e suporta ponto flutuante. É possível restringir
a quantidade de dígitos a ser preenchido (não o valor numérico). É possível usar
o método getDouble()
e recuperar um double
em vez de um
valor literal.
JNumberField
Esse componente aceita apenas números, inteiro ou longo (long
) mas
não aceita ponto flutuante. Também é possivel restringir a quantidade de dígitos
e recuperar a partir do componente um valor integer
ou long
.
JXTextField
O JXTextField pode converter tudo que o usuário digita em maiúsculo, restringir
a quantidade de caracteres e retornar o conteúdo digitado sem acentos, dependendo
das opções informadas no seu construtor.
Utlizando os componentes
Sua utilização é muito simples e possui uma classe de exemplo para baixar junto
com o projeto.
Basta colocar os pacotes dos componentes junto ao código fonte do seu projeto
e instanciar os componentes como se fossem qualquer componente do Swing, afinal
de contas é, só que estendido.
//Onde voce faria isso... JTextField tfSeuCampo = new JTextField(); //Faca assim... JDoubleField dfSeuCampo = new JDoubleField(); //Voce tambem pode usar outro construtor do componente, como por exemplo //um que limite a 5 caracteres e comece preenchido com o valor 100 JDoubleField dfSeuCampo = new JDoubleField(100, 5);
O componente JDoubleField possui os seguintes construtores permitindo maior flexibilidade:
public JDoubleField(int maxlenght); public JDoubleField(); public JDoubleField(Double value, int maxlenght)
O componente JNumberField possui os seguintes construtores:
public JNumberField(int maxlenght); public JNumberField(); public JNumberField(Integer value, int maxlenght);
O JXTextField possui mais construtores, são eles:
public JXTextField(int maxlenght) public JXTextField(int maxlenght, boolean uperCase); public JXTextField(boolean uperCase, boolean acentos); public JXTextField(int maxlenght, boolean uperCase, boolean acentos); public JXTextField(); public JXTextField(String text, int maxlenght, boolean uperCase); public JXTextField(String text, int maxlenght, boolean uperCase, boolean acentos);
Por que usar assim e não baseado em keypress?
Normalmente as pessoas implementam essas validações no pressionar de tecla do
componente, validando a cada caracter digitado e se o caracter for inválido,
retira-o. Isso dá umas piscadas no componente porque o caracter digitado chega
a aparecer e depois é retirado. Além disso, dessa forma é possivel copiar um texto
e colar dentro do campo que o keypress
não aconteceria e consequentemente
não validaria nada.
A forma como esses componentes disponibilizados foram desenvolvidos se baseia
em estender o PlainDocument
do componente, validando na camada
model, antes de ser renderizado. Por isso o caracter nem chega a aparecer se não
passar na validação, não fica piscando e resolve o problema do copiar-e-colar para
dentro do campo.
Executável

Estendendo e customizando o JTextField de Gustavo Ferreira é licenciado sob uma Licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada.
COMENTÁRIOS (6) PARA Estendendo e customizando o JTextField
Muito bom cara, parabens!
Boa Noite Camarada! Seu código é muito interessante, porém sou novato e estou usando o Netbeans, minha duvida é a seguinte: Criei esta classe, importei pra biblioteca, tudo certinho, agora como utilizo o JDoubleField por exemplo num campo do meu frmTEstaCampos, que dei o nome de txtValor. Desde já lhe agradeço pela paciência e compreensão.
Preciso do seguinte: tenho um campo que recebe medidas x, y e z. mas os campos x,y e z, podem ter 1 ou 10 dígitos cada. Como fazer uma máscara para isso?
Herculles, você usa o componente como se fosse um JTextField comum, como exemplificado logo acima.
Não sei se entendi direito sua dúvida Neemias, você precisa de um campo que aceite de 1 à 10 dígitos? Para isso você pode usar um desses componentes passando no construtor o maxlenght
Boa Tarde !!! Desde já lhe agradeço e dou-lhe os parabéns pelo trabalho. Peço sua ajuda para criar um só componente que valide: * Telefone (Ex.: (92) 98184 - 9856) * E-mail; Esta pensando em criar uma propriedade de que muda-se só modo de validação quando o programador seleciona-se ele.
GOSTOU DO PROJETO? ACHA QUE PODERIA SER MELHOR EM ALGUM PONTO? DÊ O SEU FEEDBACK!