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!