Aguarde...

Estendendo e customizando o JTextField

Publicado em 11/12/2012

Componentes customizados

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.

Código fonte

Executável

Licença Creative Commons
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

Wellington,   12/05/2014

Muito bom cara, parabens!

HERCULLES TRINDADE AMBROSIO,   03/04/2015

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.

Neemias,   07/04/2015

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?

Gustavo,   08/04/2015

www.gqferreira.com.br

Herculles, você usa o componente como se fosse um JTextField comum, como exemplificado logo acima.

Gustavo,   08/04/2015

www.gqferreira.com.br

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

Alex Cardoso,   02/07/2015

alexd12cardoso@yahoo.com.br

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!