Estou compartilhando minhas classes para validacao e limitacao de caracteres em JTextField

0 respostas
kemperacc

Pessoal,

O Nível de ajuda que recebo aqui no GUJ é tão bom que estou postando aqui as minhas classes para validaçao de e-mail, nome, site, etc…

Classe Pai:

LimitedSizePlainDocument é uma classe abstrata e a idéia principal é que ela limite o tamanho do texto a ser inserido.
Esta classe possui um metodo abstrato que chamei de validate() que serve para controlarmos o que queremos inserir na textfield.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.omegacodigos.ultra.swing;

import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 *
 * @author kemper
 */
public abstract class LimitedSizePlainDocument extends PlainDocument {

    private int maxLength = 0;

    public LimitedSizePlainDocument(int maxLength) {
        super();
        this.maxLength = maxLength;
    }

    public abstract String validadeInsertString(String str) throws BadLocationException;

    @Override
    public void insertString(int offs, String str, javax.swing.text.AttributeSet a) throws BadLocationException {

        str = validadeInsertString(str);

        if (maxLength > 0) {
            if (getLength() >= maxLength) {
                return;
            }

            if (getLength() < maxLength && (getLength() + str.length() > maxLength)) {
                str = str.substring(0, maxLength - getLength());
            }
        }

        super.insertString(offs, str, a);

    }
}

A classe LimitedSizeNameDocument estende a LimitedSizePlainDocument e implementa o validate() para aceitar apenas os caracteres que eu considero necessários, estejam a vontade para adaptar a sua necessidade.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.omegacodigos.ultra.swing;

import javax.swing.text.BadLocationException;

/**
 *
 * @author kemper
 */
public class LimitedSizeNameDocument extends LimitedSizePlainDocument {

    public LimitedSizeNameDocument(int len){
        super(len);
    }

    @Override
    public String validadeInsertString(String str) throws BadLocationException {
        //normalmente apenas uma letra é inserida por vez,
        //mas fazendo assim também previne caaso o usuário
        //cole algum texto
        StringBuffer toInsert = new StringBuffer();

        for (int i = 0; i < str.length(); i++) {
            if (Character.isLetter(str.charAt(i))) {
                toInsert.append(str.charAt(i));
            } else if (str.charAt(i) == ' ' || str.charAt(i) == '-') {
                toInsert.append(str.charAt(i));
            }
        }

        return toInsert.toString();
    }
}

Esta outra classe segue a mesma logica, porem aceita apenas caracteres validos em enderecos de e-mail:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.omegacodigos.ultra.swing;

import javax.swing.text.BadLocationException;

/**
 *
 * @author kemper
 */
public class LimitedSizeEmailDocument extends LimitedSizePlainDocument {

    public LimitedSizeEmailDocument(int len) {
        super(len);
    }

    @Override
    public String validadeInsertString(String str) throws BadLocationException {
        //normalmente apenas uma letra é inserida por vez,
        //mas fazendo assim também previne caaso o usuário
        //cole algum texto
        StringBuffer toInsert = new StringBuffer();

        for (int i = 0; i < str.length(); i++) {
            if (Character.isLetterOrDigit(str.charAt(i))) {
                toInsert.append(str.charAt(i));
            } else if (str.charAt(i) == '-' || str.charAt(i) == '+' || str.charAt(i) == '.' || str.charAt(i) == '_') {
                toInsert.append(str.charAt(i));
            } else if (str.charAt(i) == '@') {
                if (getText(0, getLength()).contains("@") == false) {
                    toInsert.append(str.charAt(i));
                }
            }
        }

        return toInsert.toString();
    }
}

E como nao podia deixar de ser, esta agora para validar a entrada de sites:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.omegacodigos.ultra.swing;

import javax.swing.text.BadLocationException;

/**
 *
 * @author kemper
 */
public class LimitedSizeSiteDocument extends LimitedSizePlainDocument {

    public LimitedSizeSiteDocument(int len) {
        super(len);
    }

    @Override
    public String validadeInsertString(String str) throws BadLocationException {
        //normalmente apenas uma letra é inserida por vez,
        //mas fazendo assim também previne caaso o usuário
        //cole algum texto
        StringBuffer toInsert = new StringBuffer();

        for (int i = 0; i < str.length(); i++) {
            if (Character.isLetterOrDigit(str.charAt(i))) {
                toInsert.append(str.charAt(i));
            } else if (str.charAt(i) == '-' || str.charAt(i) == '.' || str.charAt(i) == ':' || str.charAt(i) == '/') {
                toInsert.append(str.charAt(i));
            }
        }

        return toInsert.toString();
    }
}

A classe abaixo permite apenas numeros ate o tamanho maximo especificado

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.omegacodigos.ultra.swing;

import javax.swing.text.BadLocationException;

/**
 *
 * @author kemper
 */
public class LimitedSizeNumericDocument extends LimitedSizePlainDocument {

    public LimitedSizeNumericDocument(int len) {
        super(len);
    }

    @Override
    public String validadeInsertString(String str) throws BadLocationException {
        //normalmente apenas uma letra é inserida por vez,
        //mas fazendo assim também previne caaso o usuário
        //cole algum texto
        StringBuffer toInsert = new StringBuffer();

        for (int i = 0; i < str.length(); i++) {
            if (Character.isDigit(str.charAt(i))) {
                toInsert.append(str.charAt(i));
            }
        }

        return toInsert.toString();
    }
}

[size=24]Como usar essas classes?[/size]

Coloque-as no seu projeto e faça o seguinte com o seu jtextfield:

//Para nomes
                 meuJTextField.setDocument(new LimitedSizeNameDocument(100));

                 //Para e-mail
                 meuJTextField.setDocument(new LimitedSizeEmailDocument(100));

                 //Acho que ja deu pra entender como usar! hehehe

Eu ja possuo um esquema de validacao tambem para valores monetarios, mais ainda estou estudando como implementa-lo nesse modelo. Assim que estiver disponivel posto aqui

Abraço a Todos!

Criado 12 de março de 2010
Respostas 0
Participantes 1