Como resolvo prob. simples?

12 respostas
bsmachado

Olá…

Tenho em um JForm que tem alguns campos, tipo nome, endereço…
Como fazer para esses JTextField receber só caracteres e se o usuiário digitrar números, ele da uma mensagem!!??
Valeu a ajuda.

12 Respostas

venomtotal

bsatrianim:
Olá…

Tenho em um JForm que tem alguns campos, tipo nome, endereço…
Como fazer para esses JTextField receber só caracteres e se o usuiário digitrar números, ele da uma mensagem!!??
Valeu a ajuda.

Bom, o codigo nao sei dizer agora, mas uma logica seria vc usar o evento do JTextField correspondente a ação de apertar uma tecla, logo em seguida, vc tenta converter o que foi digitado em inteiro usando um bloco try catch. Se a conversão der erro(o cara nao digitou numeros) os comandos dentro do catch são acionados. Ou seja, dentro do catch estaria o codigo para fazer aparecer uma janela de erro.

Valder_Olmo_Correa

Bsatrianin, veja, você deve tratar o evento relacionado ao seu JTextField. No livro em que estudei, aliás, estudo ainda, tem um bom exemplo desse tratamento. Você deve implementar um método para tratar a string digitada pelomusuário, nesse caso seria um keyPressed.
Vou colocar aqui uma parte do código que está no livro. Suponha que seu JTextField seja nomeado com T1. O método ficaria da seguinte forma:

public void keyPressed(KeyEvent e)
{
      if(e.getKeyCode()<96 || e.getKeyCode()>105)  // Não é teclado numérico
      {
            e.setKeyCode(e.VK_ESCAPE);  // Cancela a tecla pressionada
            return;
       }
}

Nesse if é verificado, por meio do código ASCII se a tecla não é caracter numérico, se não for, ele cancela a tecla por do VK_SCAPE.
Agora tente usar esse exemplo para implemntar seu código.
Espero ter ajudado, pois já pedi muita ajuda aqui e sempre fui muito bem correspondido.
Para ter um conhecimento melhor, estude os controles de eventos.

Como diria o MakiavelBona,

Até !

ViniGodoy

Valder, seu algoritmo não funciona caso o usuário dê CTRL+C e CTRL+V.

Para previnir a digitação, a melhor maneira é alterar o Document relacionado ao JTextField.
Esse artigo do GUJ exemplifica como fazer isso:
http://www.guj.com.br/java.tutorial.artigo.29.1.guj

Ele mostra como editar um document para definir um tamanho máximo no JTextField.
No caso de impedir a entrada de números o princípio é o mesmo.

Se você quiser fazer a verificação após a digitação, antes dele trocar de JTextField, pode usar um InputVerifier:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/InputVerifier.html

É melhor também do que usar o mecanismo de eventos.

Por fim, sempre há a possibilidade de verificar o conteúdo no botão de salvar. Essa técnica, apesar de parecer antiga, é interessante também pq permite que o usuário digite toda a entrada sem se preocupar em olhar para a tela. Já que nenhum erro irá interrompe-lo no meio do caminho.

Valder_Olmo_Correa

ViniGodoy, legal, obrigadão, bons tutoriais ! vou estudá-los, pois acredito que esses tratamentos sejam de suma importância.
Mas, uma pergunta, por que o usuário daria Ctrl + C ou Ctrl + V nesse caso ?

Valder_Olmo_Correa

Ops, está faltando uma linha no código que postei, o correto ficaria assim:

public void keyPressed(KeyEvent e)   
{   
      if (e.getSource() == T1)
      {
           if(e.getKeyCode()<96 || e.getKeyCode()>105)  // Não é teclado numérico   
          {   
               e.setKeyCode(e.VK_ESCAPE);  // Cancela a tecla pressionada   
               return;   
          }
      }   
}
bsmachado

Só uma coisa… o T1 do cód. é referencia a que?

Valder_Olmo_Correa

T1, como eu disse, é o nome de seu elemento JTextField, declare-o da seguinte forma

T1 = new JtextField();

Depois de feito isso você deve adicioná-lo ao método KeyListener da seguinte forma:

T1.addKeyListener(this);

Espero ter ajudado.

ViniGodoy

Valder Olmo Corrêa:
ViniGodoy, legal, obrigadão, bons tutoriais ! vou estudá-los, pois acredito que esses tratamentos sejam de suma importância.
Mas, uma pergunta, por que o usuário daria Ctrl + C ou Ctrl + V nesse caso ?

Se ele estiver copiando os dados de algum outro lugar, ele pode dar ctrl+c nesse outro lugar, e ctrl+v na sua tela de cadastro.

E aí, o campo aceitará qualquer coisa.

Um exemplo: Seu campo de “Renavam” só aceita números. O cara vai cadastrar um carro, e já tem aberta a página do Detran. Ele copia de lá o Renavam (que também tem traços e pontos) e cola no seu cadastro. O seu cadastro aceitará os pontos e as letras, já que o CTRL+V não dispara o evento KeyPressed. E voilá, vc tem uma inconsistência nos dados. Com o document, isso não tem como acontecer. :wink:

Valder_Olmo_Correa

Ótima explicação, Vinni. Bem, então o bom mesmo é estudar o Document.
Obrigadão pela dica.

bsmachado

Bem, estou usando o Netbeans e so implementar o comando keyPressed e no lugar de T1, o nome do campo que tem o nome do JTextField.

bsmachado

public void keyPressed(KeyEvent e) { if (e.getSource() == T1) { if(e.getKeyCode()<96 || e.getKeyCode()>105) // Não é teclado numérico { e.setKeyCode(e.VK_ESCAPE); // Cancela a tecla pressionada return; } } }

Para delimitar o tamanho do campo é so por os valores no < maior e menor dentro do if por exemplo 0 a 100 que seria o tamanho de um campo nome por exemplo?

ViniGodoy

bsatrianim:
Para delimitar o tamanho do campo é so por os valores no < maior e menor dentro do if por exemplo 0 a 100 que seria o tamanho de um campo nome por exemplo?

Incrível! Como expliquei a 1 ano atrás, esse evento não serve justamente por causa do CTRL+C e CTRL+V. O correto mesmo é implementar um Document, como ensinado no tutorial Controlando um JTextField, aqui do GUJ.

Criado 14 de junho de 2008
Ultima resposta 10 de mar. de 2009
Respostas 12
Participantes 4