Como limitar caracteres especiais em um JTextField?
4 respostas
Bambatera
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.
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
B
bezier_curve
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.
Você pode criar um DocumentListener. KeyTyped é um evento notoriamente difícil de usar em um JTextField.
Galera, resolvi o problema, criei um PlainDocument e coloquei JTextField.
Olha como ficou:
publicclassCustomDocumentextendsPlainDocument{privateintpintMaxLength=0;privatebooleanpblnUpperCase=false;privatebooleanpblnSpecialChar=true;privatebooleanpblnAllowNumbers=true;privatebooleanpblnAllowFloat=true;privatebooleanpblnAllowLetters=true;privatebooleanpblnAllowSpaces=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. */publicCustomDocument(intmaxLength,booleanupperCase,booleanspecialChars,booleanallowNumbers,booleanallowFloat,booleanallowLetters,booleanallowSpaces){super();pintMaxLength=maxLength;pblnUpperCase=upperCase;pblnSpecialChar=specialChars;pblnAllowNumbers=allowNumbers;pblnAllowFloat=allowFloat;pblnAllowLetters=allowLetters;pblnAllowSpaces=allowSpaces;}@OverridepublicvoidinsertString(intoffs,Stringstr,AttributeSetatt)throwsBadLocationException{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){Patternp=Pattern.compile("^[a-zA-Z0-9\\s]+$");Matcherm=p.matcher(str);if(!m.matches()){return;}}if(!pblnSpecialChar&&!pblnAllowNumbers&&pblnAllowLetters&&pblnAllowSpaces){Patternp=Pattern.compile("^[a-zA-Z\\s]+$");Matcherm=p.matcher(str);if(!m.matches()){return;}}if(!pblnSpecialChar&&!pblnAllowNumbers&&pblnAllowLetters&&!pblnAllowSpaces){Patternp=Pattern.compile("^[a-zA-Z]+$");Matcherm=p.matcher(str);if(!m.matches()){return;}}if(!pblnSpecialChar&&pblnAllowNumbers&&!pblnAllowLetters&&!pblnAllowSpaces&&!pblnAllowFloat){Patternp=Pattern.compile("^[0-9]+$");Matcherm=p.matcher(str);if(!m.matches()){return;}}if(!pblnSpecialChar&&pblnAllowNumbers&&!pblnAllowLetters&&pblnAllowSpaces&&!pblnAllowFloat){Patternp=Pattern.compile("^[0-9\\s]+$");Matcherm=p.matcher(str);if(!m.matches()){return;}}if(!pblnSpecialChar&&pblnAllowNumbers&&!pblnAllowLetters&&!pblnAllowSpaces&pblnAllowFloat){Patternp=Pattern.compile("^/[0-9]|\\,/");Matcherm=p.matcher(str);if(!m.matches()){return;}}intintLen=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. */privateStringremoveAcentos(Stringstr){StringstrTexto;strTexto=Normalizer.normalize(str,Normalizer.Form.NFD);strTexto=strTexto.replaceAll("[^\\p{ASCII}]","");returnstrTexto;}
Não ficou exatamente como eu queria, mas já resolveu boa parte do meu problema.