Campo aceitar apenas números (Como faço ?)

9 respostas
Valder_Olmo_Correa

Pessoal, seguinte, antes de perguntar algo aqui eu pesquiso bastante, pois evito perguntar. Pesquisei sobre como fazer para que determinados campos aceitem apenas números e encontrei alguns tópicos, um deles de 2004, que é o seguinte:

http://www.guj.com.br/posts/list/13598.java#70834

Neste campo o Roberto, se não me engano, descreve como fazer isso exatamente com está no livro em que estou aprendendo, o código é muito parecido. O probelma é que não etá funcionando. No exemplo que o livro usa para ensinar esse assunto, Controle de Eventos, também não funciona, pois o campo acaba aceitando qualquer tecla, caracter ou números.

Aí eu pergunto, como resolver esse problema ? Já tentei de tudo ! Pesquisei no Google sobre a tabela ASC e encontrei em todos os resultados da pesquisa que os caracteres numéricos vão de 48 até 57, vejam:

http://www.inf.puc-rio.br/~inf1381/material/ascii.pdf

Tentei usar essa faixa de caracteres, mas não deu em nada, continua o mesmo problema.
Escrevi exatamente o que o Roberto propôs no tópico, nada ! Fui ver o tutorial lá postado, mas ele só fala de limitar o número de caracteres num campo.

Alguém pode me ajudar com mais esse problema ?

Meu código está aí embaixo:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Exercicio1003 extends JFrame implements ActionListener, ItemListener, KeyListener
{
	JLabel label1,label2,label3;
	JTextField t1,t2;
	JButton b1,b2;
	JComboBox combo;


    public static void main (String args[])
    {
	   JFrame janela = new Exercicio1003();
	   janela.setUndecorated(true);
	   janela.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
	   janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   janela.setVisible(true);
    }

    Exercicio1003()
    {
	   setTitle("Cálculo do preço final");
	   setBounds(200,50,380,130);
	   getContentPane().setBackground(new Color(135,206,235));
	   label1 = new JLabel("Informe o valor de vendas");
	   label1.setForeground(Color.black);
	   label1.setFont(new Font("Arial", Font.BOLD,12));
	   label2 = new JLabel("Escolha a forma de pagamento");
	   label2.setForeground(Color.black);
	   label2.setFont(new Font("Arial", Font.BOLD,12));
	   label3 = new JLabel("Preço final a pagar");
	   label3.setForeground(Color.black);
	   label3.setFont(new Font("Arial", Font.BOLD,12));
	   t1 = new JTextField();   t2 = new JTextField();  t2.setEditable(false);
	   b1 = new JButton("Calcular");   b1.addActionListener(this);
	   b2 = new JButton("Limpar");     b2.addActionListener(this);
	   String[] opcoes = {"Dinheiro","Cheque","Cartao"};
	   combo = new JComboBox(opcoes);
	   combo.addItemListener(this);
	
	   getContentPane().setLayout(new GridLayout(4,2,2,2));
	   getContentPane().add(label1);
	   getContentPane().add(t1);
	   getContentPane().add(label2);
	   getContentPane().add(combo);
	   getContentPane().add(label3);
	   getContentPane().add(t2);
	   getContentPane().add(b1);
	   getContentPane().add(b2);
    }

    public void actionPerformed(ActionEvent e)
    {
	   if(e.getSource()==b2)
	   {
		   t1.setText("");  t2.setText("");
		   return;
	   }
	   float n1 = 0;
	   double total = 0;
	   try
	   {
		   n1 = Float.parseFloat(t1.getText());
	   }
	   catch (NumberFormatException erro)
	   {
		   t2.setText("Erro");
		   return;
	   }
	   if(combo.getSelectedItem()== "Dinheiro")
	   {
		  total = n1*0.95;
	   }
	   if(combo.getSelectedItem()== "Cheque")
	   {
		  total = n1*1.05;
	   }
	   if(combo.getSelectedItem()== "Cartao")
	   {
		  total = n1*1.1;
	   }
	   if(e.getSource()== b1)
	   {
	   	   t2.setText("" + total);
	   }
    }
    
    public void keyPressed(KeyEvent e)
    {
    	if (e.getSource()==t1)
    	{    	
    	    if(e.getKeyCode()<96||e.getKeyCode()>105)
    	    {
    	        e.setKeyCode(e.VK_ESCAPE);
    	        return; 
    	    }
    	    if(e.getKeyCode()==44)
    	    {
    	    	t1.setText(t1.getText()+ ".");
    	    }    		    
    	}
    }
    
    public void keyReleased(KeyEvent e)
	{
		// Uma tecla foi solta
	}
	public void keyTyped(KeyEvent e)
	{
		// Uma tecla Unicode foi pressionada
	}
    
    public void itemStateChanged(ItemEvent r)
    {
    	combo.getSelectedItem();
    }
}

Preciso que o JTextField t1 aceite apenas caracteres numéricos, a tecla BackSpace e trasforme a vírgula em ponto decimal.
A parte do código que vai da linha 99 até a 102 são para fazer com que o campo transforme em ponto decimal(.) quando o usuário digitar vírgula(,). Mas também não está funcionando, se alguém puder ajudar mais nesse problema, ficaria muito grato também.

EStou meio que perdido com essa parte de Controle de Eventos.

E então, alguém pode ajudar aí ?

Obrigado desde já !

9 Respostas

maquiavelbona

O seu caso pode ser resolvido com o uso de formatadores, como no recente tópico: http://guj.com.br/posts/list/81197.java

Agora é só adaptar ao seu código. Nada de ficar olhando tabela ASCII.

Até!

ViniGodoy

É muito tranquilo também adaptar a dica desse artigo:
http://www.guj.com.br/java.tutorial.artigo.29.1.guj

Para que ele só aceite números inteiros. Para floats é um pouco menos tranquilo, mas dá para fazer também.

gilberto_oliveira

Olá valder,

Tive este problema pra formatar o campo número de endereço que só devia aceitar números, aí fiz assim:

Atenção: usei o jFormatedTextField

numero.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#0"))));
//numero -> é o meu jFormatedTextField

Esse código feio aí foi o netbeans que fez :x, eu só cliquei na propriedade FormatterFactory e em Format digitei #0 e pronto.

Agora ele só aceita números :D.

Flw

G

Valder,

Que livro está utilizando nos estudos???

Obrigado.

Valder_Olmo_Correa

Poxa pessoal, muito obrigado pelas dicas, mas infelizmente dessa vez eu não entendi o conteúdo, parece que me falta estudar mais a parte teórica mesmo. Ainda não vi o JFormatedTextField com funciona, então fiquei perdido no exemplo que o Maquiavel postou, nem sei qual ou quais classes implementar aqui em meu exemplo.

De qualquer forma, agradeço muito. Não consegui resolver meu problema, mas o tópico, pelo menos até aqui, serviu para eu saber como estou nos estudos, e chego à conclusão de que devo estudar essas classes aí que postaram. Portanto, o tópico serviu sim, e muito, pois começarei a estudar agora mesmo esseas classes, acho que no “Java, como Programar” do Deitel tem o material suficiente para isso.

Muito obrigado galera !!!

Guilherme:

Estou usando o livro da editora Érica, “Java2 Ensino Didático, Desenvolvendo e Implementando Aplicações”, autor Sérgio Furgeri. Muito bom, mas também tenho o “Java, como Programar” do Deitel 6ª edição.

Valder_Olmo_Correa

Opa ! Resolvido !

Era só acrescentar a seguinte linha de código:

import javax.swing.event.*;

Mas essa tabela ASCII aí que eu pesquisei ainda está me intrigando viu. Alguém poderia me explicar o por que os algarismos nela têm os códigos diferentes ?

Mas, logicamente estudarei os tópicos postados aí pelo pessoal.

Valeu aí, galera !

squall926

Ola!
Olhei a tabelha ascii q vc mencionou, e não vi nada de diferente…

Valder_Olmo_Correa

Squall,

A tabela ASCII que eu postei parece que os números vaõ de 48 a 57. A faixa que vai de 96 a 105 paraece que á 96 = ` (crase) e de 97 a 105 vai do “a” até o “i”.

E também na solução do meu problema co campo t1 não pode ser JTextField, deve ser TestField, pois, como exploca o livro aqui, JTExtField não pertence ao pacote swing, que por sua vez não implementa KeyListener. Se entendi, acho que é isso.

Agora alguém poderia me ajudar a fazer que quando o usuário digitar a vírgula, essa seja substituída pelo ponto decimal ?

squall926

Caro colega…
javax.swing.JTextField
Como pode ver, JTextField é do pacote Swing sim, e tb implementa KeyListener, talvez vc n esteja fazendo os import’s necessarios!

Criado 7 de fevereiro de 2008
Ultima resposta 12 de fev. de 2008
Respostas 9
Participantes 6