• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSpinnerで無効な値の入力を許可しない
#navi(../)
RIGHT:Posted by [[terai]] at 2010-03-08
*JSpinnerで無効な値の入力を許可しない [#hb960cf3]
JSpinnerからJFormattedTextFieldを取得し、これに無効な値の入力を許可しないように設定します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#d07eefaa]
#code{{
private static DefaultFormatterFactory makeFFactory(final SpinnerNumberModel m) {
  final NumberFormat format = new DecimalFormat("####0");
  NumberFormatter displayFormatter = new NumberFormatter(format);
  NumberFormatter editFormatter = new NumberFormatter(format) {
    @Override public Object stringToValue(String text) throws ParseException {
      Long val = (Long)format.parse(text);
      Long max = (Long)m.getMaximum();
      Long min = (Long)m.getMinimum();
      if(max.compareTo(val)<0 || min.compareTo(val)>0) {
        throw new ParseException("xxx", 0);
      }
      return val;
    }
  };
  editFormatter.setAllowsInvalid(false);
  //editFormatter.setCommitsOnValidEdit(true);
  editFormatter.setValueClass(Long.class);
  return new DefaultFormatterFactory(displayFormatter, displayFormatter, editFormatter);
}
}}

**解説 [#rb11baf0]
上記のサンプルでは、DefaultFormatter#setAllowsInvalid(false) などを設定した DefaultFormatterFactory を作成して、JSpinnerから取得したJFormattedTextFieldにsetFormatterFactoryで追加しています。

- 上
-- SpinnerNumberModel を設定した通常のJSpinner
-- 別コンポーネントにフォーカスが移動するときに、値が有効か無効かを判断
- 下
-- SpinnerNumberModel を設定し、数値以外の無効な文字入力ができないようにしたJSpinner

**参考リンク [#w7e4185e]
-[[JTextFieldの入力を数値に制限する>Swing/NumericTextField]]

**コメント [#h6eb49c7]
#comment