Galera, minha situação é a seguinte, estou desenvolvendo uma aplicação swing na qual o cliente me pediu que o usuário não pudesse utilizar os caracteres especiais para preencher os campos na tela, ou seja, somente seriam permitidos letras e números, consegui fazer isso verificando por meio de regex antes de enviar pro banco de dados, porém, o cliente quer que no momento da digitação o sistema bloqueie o caracter especial ou caso seja, por exemplo, ‘Ç’ o sistema converta para ‘C’, então veio a idéia de criar um componente que:
- eu possa bloquear, por meio de propriedades, caracteres especiais.
- limitar o número de caracteres digitados.
- permitir apenas letras.
- permitir apenas números (inteiros ou valor monetário).
- permitir letras e números.
Então fica a pergunta, como posso fazer isso no java swing? Estou usando o Netbeans 7.2.1.
Desde já agradeço a ajuda.
Bambatera,
segue algumas coisas que você pode fazer:
Usuar o evento key typed para dentro do JTextField e dentro desse evento você controlar o que você quer fazer.
att
Nilson
[quote=Bambatera]
- eu possa bloquear, por meio de propriedades, caracteres especiais.
- limitar o número de caracteres digitados.
- permitir apenas letras.
- permitir apenas números (inteiros ou valor monetário).
- permitir letras e números.[/quote]
Você pode criar um DocumentListener. KeyTyped é um evento notoriamente difícil de usar em um JTextField.
Acho que ele não quis dizer um DocumentListener, e sim um Document. Veja o javadoc do JTextField para ver como é que se cria um Document. http://docs.oracle.com/javase/6/docs/api/javax/swing/JTextField.html
Galera, resolvi o problema, criei um PlainDocument e coloquei JTextField.
Olha como ficou:
public class CustomDocument extends PlainDocument {
private int pintMaxLength = 0;
private boolean pblnUpperCase = false;
private boolean pblnSpecialChar = true;
private boolean pblnAllowNumbers = true;
private boolean pblnAllowFloat = true;
private boolean pblnAllowLetters = true;
private boolean pblnAllowSpaces = true;
/**
* Contrutor do <tt>PlainDocument</tt>.
*
* @param maxLength Tamanho máximo permitido no campo.
* @param upperCase <tt>true</tt> coloca a string digitada em caixa alta, <tt>false</tt> permance como está.
* @param specialChars <tt>true</tt> permite a digitação de caracteres especiais, <tt>false</tt> não permite.
* @param allowNumbers <tt>true</tt> permite a digitação de números, <tt>false</tt> não permite.
* @param allowFloat <tt>true</tt> permite a digitação de valores monentários, <tt>false</tt> não permite.
* @param allowLetters <tt>true</tt> permite a digitação de letras, <tt>false</tt> não permite.
* @param allowSpaces <tt>true</tt> permite a digitação de espaços, <tt>false</tt> não permite.
*/
public CustomDocument(int maxLength, boolean upperCase, boolean specialChars, boolean allowNumbers, boolean allowFloat, boolean allowLetters, boolean allowSpaces) {
super();
pintMaxLength = maxLength;
pblnUpperCase = upperCase;
pblnSpecialChar = specialChars;
pblnAllowNumbers = allowNumbers;
pblnAllowFloat = allowFloat;
pblnAllowLetters = allowLetters;
pblnAllowSpaces = allowSpaces;
}
@Override
public void insertString(int offs, String str, AttributeSet att) throws BadLocationException {
str = removeAcentos(str);
if (pblnUpperCase) {
str = str.toUpperCase();
}
if (pintMaxLength <= 0 && pblnSpecialChar && pblnAllowNumbers && pblnAllowFloat && pblnAllowLetters && pblnAllowSpaces) {
super.insertString(offs, str, att);
return;
}
if (!pblnSpecialChar && pblnAllowNumbers && pblnAllowLetters && pblnAllowSpaces) {
Pattern p = Pattern.compile("^[a-zA-Z0-9\\s]+$");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
if (!pblnSpecialChar && !pblnAllowNumbers && pblnAllowLetters && pblnAllowSpaces) {
Pattern p = Pattern.compile("^[a-zA-Z\\s]+$");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
if (!pblnSpecialChar && !pblnAllowNumbers && pblnAllowLetters && !pblnAllowSpaces) {
Pattern p = Pattern.compile("^[a-zA-Z]+$");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && !pblnAllowSpaces && !pblnAllowFloat) {
Pattern p = Pattern.compile("^[0-9]+$");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && pblnAllowSpaces && !pblnAllowFloat) {
Pattern p = Pattern.compile("^[0-9\\s]+$");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
if (!pblnSpecialChar && pblnAllowNumbers && !pblnAllowLetters && !pblnAllowSpaces & pblnAllowFloat) {
Pattern p = Pattern.compile("^/[0-9]|\\,/");
Matcher m = p.matcher(str);
if (!m.matches()) {
return;
}
}
int intLen = getLength() + str.length();
if (intLen > pintMaxLength) {
return;
}
super.insertString(offs, str, att);
}
/**
* Remove acentos de uma string passada como parâmetro.
*
* @param str String na qual serão removidos os acentos.
* @return String limpa, ou seja, sem acentos.
*/
private String removeAcentos(String str) {
String strTexto;
strTexto = Normalizer.normalize(str, Normalizer.Form.NFD);
strTexto = strTexto.replaceAll("[^\\p{ASCII}]", "");
return strTexto;
}
Não ficou exatamente como eu queria, mas já resolveu boa parte do meu problema.
Valeu pelas dicas.