数字入力のみを受け付けるテキストフィールド

import javax.swing.*;
import javax.swing.text.*;

/**
 * 数字入力のみを受け付けるテキストフィールドです。
 */
public class JNumberField extends JTextField {
    /**
     * 新しい NumberField を構築します。
     * デフォルトモデルが作成され、初期文字列は null で、列数が 0 に設定されます。
     */
    public JNumberField() {
        super();
    }

    /**
     * 指定された列数で新しい空の NumberField を構築します。
     * デフォルトモデルが作成され、初期文字列は null に設定されます。
     * @param columns 適切な幅を計算するのに使う列数。
     */
    public JNumberField(int columns) {
        super(columns);
    }

    /**
     * 指定されたテキストで初期化される新しい NumberField を構築します。
     * デフォルトモデルが作成され、列数は 0 です。
     * @param text 表示されるテキストまたは null
     */
    public JNumberField(String text) {
        super(text);
    }

    /**
     * 指定されたテキストと列数で初期化される新しい NumberField を構築します。
     * デフォルトモデルが作成されます。 
     * @param text 表示されるテキストまたは null
     * @param columns 適切な幅を計算するのに使う列数。
     */
    public JNumberField(String text, int columns) {
        super(text, columns);
    }

    /**
     * モデルが明示的に指定されない場合は、構築時に使うモデルのデフォルト実装を作成します。
     * NumberDocument のインスタンスが返されます。
     */
    protected Document createDefaultModel() {
        return new NumberDocument();
    }

    /**
     * 数値ドキュメントです。
     */
    static class NumberDocument extends PlainDocument {
        /** 入力が許される文字 */
        private String value = "0123456789";

        /**
         * ドキュメントに内容を挿入します。
         * @param offs 開始オフセット >= 0
         * @param str 挿入する文字列。null や空の文字列の場合は何もしない
         * @param a 挿入されたコンテンツの属性
         * @throws BadLocationException 指定された挿入の位置が、ドキュメント内の有効な位置ではない場合
         */
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if((str == null) || (str.equals(""))) {
                return;
            }
            for(int i = 0 ; i < str.length() ; i++) {
                if (value.indexOf(str.substring(i, i + 1)) == -1) {
                    return;
                }
            }
            super.insertString(offs, str, a);
        }
    }
}