Impedir caracteres especiais no JTextField[RESOLVIDO]

Gente, como eu posso impedir o usuário de digitar caracteres como ŦØÞªĸJĦŊĐÆºŁ ?

Eu consigo não permitir números nem caracteres como !@#$%*(), mas se o usuário presionar ALT GR + um monte de

teclas do teclado, esses caracteres aparecem…

Abaixo minha classe q não permite a maioria dos caracteres especiais:

public class ControlarEntradaTexto extends PlainDocument{ @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{ if(Character.isLetter(str.charAt(0)) || str.equals("_") || str.equals(" ") ){ super.insertString(offs, str.toUpperCase(), a); } }

Cara não sei como te ajudar mas, vc não poderia fazer o inverso como solução?
Montando os que podem ser aceitos [a-zA-Z][0-9]
Ou negando se [^a-zA-Z][^0-9]

davidbuzatto desculpa por postar o msm tópico duas vezes, é que tinha aparecido um erro na hora de eu enviar

a primeira vez, daí achei q não tivesse ido… :oops:

Não foi por querer…

Frantic Avenger, mas isso não impediria as acentuações ?

Sem problema Elesis.

[]'s

[quote=ElesisLink]davidbuzatto desculpa por postar o msm tópico duas vezes, é que tinha aparecido um erro na hora de eu enviar

a primeira vez, daí achei q não tivesse ido… :oops:

Não foi por querer…

Frantic Avenger, mas isso não impediria as acentuações ?[/quote] Só olhar o código do moderador [b]thingol[/b] e adaptar a sua necessidade. [url]http://www.guj.com.br/java/75020-acentos-no-java-[/url]

Qualquer dúvida e eu puder ajudar, só postar.

Talvez os caracteres estranhos que apareçam sejam em cirílico, aramaico, grego, etc… Ou seja, podem não ser do nosso idioma, mas são letras.
Aí a dica do Thingol realmente pode servir.

Outra coisa, movi seu tópico para o fórum de interface gráfica. Outra opção seria java avançado, já que se trata de encoding.

Hum… Faz sentido.

So não sei como posso implementat o código do Thingol para fazer isso…

Alguém tem uma idéia de como eu posso fazer isso ?

Isso só acontece quando o usuário pressiona a tecla ALT GR. Tem como eu bloquear esta tecla na hora que o usuário estiver digitando ?

Realmente não sei se o que estou falando é viável, mas não faria sentido usar?

KeyEvent.VK_ALT KeyEvent.VK_ALT_GRAPH

Pois é, dei uma varrida na API de localização (java.text) também não achei uma função que teste por isso.

Talvez você tenha que fazer do jeito braçal mesmo. Criar um HashSet com todos os caracteres que você quer que sejam válidos, e testar nesse seu método se o que foi digitado está dentro desse set.

Não adianta bloquear o ALT_GR, pois usuários com teclados internacionais ainda poderão digitar esse tipo de letra.
Ou, eles podem simplesmente fazer copy&paste da letra de algum lugar da web…

Nossa, e verdade. Não tinha pensado nisso…

No caso, não poderia permitir tbm copy&paste…

E agora ? Como eu posso validar isso ? O q é HashSet ?

O document impede o copy&paste.

Set é uma das estruturas de dados previstas na Collections Framework. É uma estrutura que representa um conjunto de dados sem repetição. Uma das grandes vantagens do set é o tempo de busca, que tenta ser próximo de O(1) - ou seja, constante e geralmente tão rápido quanto acessar um array.

O HashSet é um tipo de Set.
Ele não é ordenado, com tempo de busca de O(1).

Outro tipo é o TreeSet, que é um Set Ordenado, com tempo de busca igual a O(log2n).

Para criar, você faz assim:

Character chs[] = {'0', '1', '2', '3', '4', ...}; //Coloque aqui todos os caracteres válidos Set<Character> validos = new HashSet<Character>(Arrays.asList(chs));

E aí é só deixar seu Document assim:

public class ControlarEntradaTexto extends PlainDocument{ @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{ char[] chars = str.toUpperCase().toCharArray(); StringBuilder inserted = new StringBuilder(); for (char ch : chars) { if (validos.contains(ch)) { inserted.append(ch); //Filtramos só o que é válido } } super.insertString(offs, inserted.toString(), a); }

É por causa do copy&paste que também não basta só testar o conteúdo do charAt(0). Com copy&paste podem vir vários caracteres no insertString.

ViniGodoy, ta dando erro na linha

no getChars().

e no inserted.add(ch);, tava dando erro, daí eu troquei para append(ch) e o erro sumiu… esta certo ?

É toCharArray() no lugar de getChars(). E é mesmo append no lugar de add.
Já corrigi lá em cima.

Valeu ViniGodoy… So uma ultima pergunta: eu vou ter q setar cada caractere válido, é isso ?

Tipo assim:

Onde ele so vai aceitar esse tipo de caractere, né ?

Uma forma simples é estipular uma expressão regular bem bobinha. Você quer de A até Z, de 0 até 9, e espaço (por exemplo)?

Então a expressão seria:

“[^A-Za-z0-9 ]”

para indicar tudo que NÃO É A-Z, a-z, 0-9 e espaço.

Ou seja:

public class ControlarEntradaTexto extends PlainDocument{  
        @Override  
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{  
            str = str.replaceAll ("[^A-Za-z0-9 ]", "");
            super.insertString(offs, inserted.toString(), a);  
    }  

Isso.
Como usamos o toUppercase, basta usar os caracteres em maiúsculo.

ÍNCRÍVEL!!!

Funcionou melhor do que o esperado, ViniGodoy, valeu mesmo cara…

PS: Valeu a todos que puderam me ajudar, de verdade… :smiley: