Evento Update do JTextField

Olá pessoal! :thumbup:
Estou tentando verificar se o usuário digita texto no campo de texto, pois ele só deve colocar números. Então tentei isso:

package testes;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class EventoUpdate extends JFrame
{
	public JTextField tfCampo;
	public static void main(String[] args) 
	{
		EventoUpdate eu = new EventoUpdate();
		eu.setVisible(true);

	}
	public EventoUpdate()
	{
		setLayout(null);
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setTitle("Evento Uptade");
		setLocationRelativeTo(null);
		setResizable(false);
		//****
		tfCampo = new JTextField();
		tfCampo.setBounds(100,120,100,25);
		getContentPane().add(tfCampo);

		tfCampo.addCaretListener(new javax.swing.event.CaretListener() {
			public void caretUpdate(javax.swing.event.CaretEvent e) {
				{
					if (tfCampo.getText().length()>0)
					{
						String idade = "";
						int tamanhoIdade=0;
						try
						{
							Integer.parseInt(tfCampo.getText());
						}
						catch(Exception ex)
						{
							tamanhoIdade = tfCampo.getText().length();
							idade = tfCampo.getText();
							tfCampo.setText("");
						}
					}
				}
			}
		});
	}
}

Esse é um exemplo do que tento fazer. É só copiar e rodar, dão uma olhada no erro que dá, isso era para funcionar.
Toda vez que o usuário digita um carácter ele verifica se é uma letra e se for ele remove a última digitada.

Você não pode chamar o método setText() dentro do evento CaretListener, pois isso causaria outro evento CaretListener.
Neste caso acho que você deveria usar o evento keyReleased.
Dá uma olhada nas alterações que fiz no código:

package testes;  

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class EventoUpdate extends JFrame implements KeyListener {

    public JTextField tfCampo;

    public static void main(String[] args) {
        EventoUpdate eu = new EventoUpdate();
        eu.setVisible(true);
    }

    public EventoUpdate() {
        setLayout(null);
        setSize(300, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Evento Uptade");
        setLocationRelativeTo(null);
        setResizable(false);
        //****
        tfCampo = new JTextField();
        tfCampo.setBounds(100, 120, 100, 25);
        getContentPane().add(tfCampo);
        tfCampo.addKeyListener(this);
    }

    public void keyReleased(KeyEvent e) {
        if (tfCampo.getText().length() > 0) {
            String idade = "";
            int tamanhoIdade = 0;
            try {
                Integer.parseInt(tfCampo.getText());
            } catch (Exception ex) {
                tamanhoIdade = tfCampo.getText().length();
                idade = tfCampo.getText();
                tfCampo.setText(tfCampo.getText().substring(0, tfCampo.getText().length()-1));
            }
        }
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
    }
}

Uma sugestão para facilitar o seu trabalho e criar o mesmo “efeito” é utilizar um Document.
Dê uma olhada nesse artigo:
http://www.guj.com.br/java.artigo.29.1.guj

Meus cumprimentos !!

Só mais uma sugestão Ferreira. Caso vc tenha a necessidade de utilizar mais campos com a validação somente dígitos.
Nos aki criamos esta classe que herda de “jTextField” mas que não permite a entrada de dados que não sejam números.
Você pode usa-lá no lugar do JText…

Bom então segue aí …

[code]
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**

  • @author Evandro

  • @author Thiago

  • 13/06/2008
    */
    public class NumberField extends JTextField {

    private static final long serialVersionUID = 991963450143845631L;

    /**

    • Constructor
      */
      public NumberField() {}

    /**

    • Constructor

    • @param text
      */
      public NumberField( String text ) {
      super( text );
      setDocument( new PlainDocument() {
      private static final long serialVersionUID = -6744534142990587378L;

      @Override
      public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException {
      // usually only one letter is inserted at a time,
      // but doing so also prevents the user case
      // paste some text
      for( int i = 0; i < str.length(); i++ )
      if( Character.isDigit( str.charAt( i ) ) == false ){
      return;
      }
      super.insertString( offs, str, a );

       }
      

      } );
      }

}[/code]

Gostei da sua idéia aguiaMem,importei a classe NumberField, troquei os meus JTextField por NumberField, rodo e não dá erro mas também não mudou nada.