TITLE:JSpinnerで無効な値の入力を許可しない

Posted by terai at 2010-03-08

JSpinnerで無効な値の入力を許可しない

JSpinnerからJFormattedTextFieldを取得し、これに無効な値の入力を許可しないように設定します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

JSpinner.NumberEditor editor = (JSpinner.NumberEditor)spinner.getEditor();
editor.getTextField().setFormatterFactory(makeFFactory(m));
//DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
//formatter.setAllowsInvalid(false);
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);
}

解説

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

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

参考リンク

コメント