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

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á !

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é!

É 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.

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

Valder,

Que livro está utilizando nos estudos???

Obrigado.

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.

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 !

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

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 ?

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!