codice:
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class OnlyNumbersTextField extends JTextField
{

    /**
     * 
     */
    private static final long serialVersionUID = 8554350982699149972L;

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(new OnlyNumbersTextField(10));
        frame.pack();
        frame.setVisible(true);
    }

    /*
     * Costruttore con unico parametro il limite della textfield
     */
    public OnlyNumbersTextField(int cols)
    {
        super(cols);
        setDocument(new TextLimitDocument());
    }

    /***************************************************************************
     * Classe interna per la gestione dell'input
     **************************************************************************/
    private class TextLimitDocument extends PlainDocument
    {
        /**
         * 
         */
        private static final long serialVersionUID = 5408078764971166982L;

        /*
         * Funzione per l'inserimento della stringa nella textfield
         */
        public void insertString(int offset, String str, AttributeSet attr)
                throws BadLocationException
        {
            boolean invalid = false;

            if (str == null)
                return;

            if (!str.matches("[0-9]*"))
                return;

            super.insertString(offset, str, attr);

        }
    }

}
Ho buttato giù due righe di codice in due minuti, questa soluzione ha un problema: se inserisci tramite copia e incolla una stringa che contiene sia numeri che altri caratteri l'intera stringa viene rifiutata mentre l'ideale sarebbe inserire solo i numeri di quella stringa, non dovrebbe essere difficile migliorarla in queto senso, lo lascio a te