MaxLengthField(n) ti costruisce un campo di testo che non accetta piu di n caratteri, con MaxLengthField(n, k) stabilisci anche il numero di colonne che il campo deve avere (k). Ampliando i controlli eseguiti in MaxLengthDocument.insertString puoi controllare che la stringa risultatnte dall'inserimento sia un numero, e solo in questo caso invocare super.insertString(offs, str, a) altrimenti fai un return e l'inserimento non sarà accettato.

codice:
class MaxLengthField extends JTextField {

	private int maxLength;

	//Il primo parametro del costruttore rappresenta il numero
	//massimo di caratteri
	public MaxLengthField(int maxLength, int cols) {
		super(cols);
		this.maxLength = maxLength;
	}

	public MaxLengthField(int maxLength) {
			this(maxLength, maxLength);
	}

	protected Document createDefaultModel() {
		return new MaxLengthDocument();
	}

	//Metodo per cambiare dinamicamente il numero massimo di caratteri
	//che il campo può contenere
	public void setMaxLenght(int maxLength){
		this.maxLength = maxLength;
	}

	//Restituisce il numero massimo di caratteri che il campo può
	//contenere
	public int getMaxLenght(){
		return maxLength;
	}

	//Il Document che gestisce l'inserimento del testo
	class MaxLengthDocument extends PlainDocument {

		//La stringa da inserire se è troppo lunga viene troncata
		public void insertString(int offs, String str, AttributeSet a)
			throws BadLocationException {

			if (str == null)
				return;

			if(getLength() == maxLength)
				return;

			if(str.length() + getLength() > maxLength)
				str = str.substring(0, maxLength - getLength());

			super.insertString(offs, str, a);
		}
	}

}