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

Posted by aterai at 2010-03-08

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

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

  • &jnlp;
  • &jar;
  • &zip;
NumberFormatter.png

サンプルコード

JSpinner.NumberEditor editor = (JSpinner.NumberEditor)spinner.getEditor();
DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter();
formatter.setAllowsInvalid(false);

解説

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

    • SpinnerNumberModel を設定した通常のJSpinner
    • 別コンポーネントにフォーカスが移動するときに、値が有効か無効かを判断
    • SpinnerNumberModel を設定し、数値以外の無効な文字入力ができないようにしたJSpinner
    • SpinnerNumberModel を設定した通常のJSpinner
    • 別コンポーネントにフォーカスが移動するときに、値が有効か無効かを判断
    • 無効な値の場合は、背景色を変更
      private static JSpinner makeSpinner2(SpinnerNumberModel m) {
        JSpinner s = new JSpinner(m);
        JSpinner.NumberEditor editor = (JSpinner.NumberEditor)s.getEditor();
        editor.getTextField().setFormatterFactory(makeFFactory(m));
        editor.getTextField().addFocusListener(new FocusAdapter() {
          public void focusLost(FocusEvent e) {
            final JTextComponent tc = (JTextComponent)e.getSource();
            EventQueue.invokeLater(new Runnable() {
              public void run() {
                tc.setBackground(Color.WHITE);
              }
            });
          }
        });
        return s;
      }
      private static DefaultFormatterFactory makeFFactory(final SpinnerNumberModel m) {
        final NumberFormat format = new DecimalFormat("####0");
        NumberFormatter displayFormatter = new NumberFormatter(format);
        NumberFormatter editFormatter = new NumberFormatter(format) {
          private final Color color = new Color(255,200,200);
          //protected DocumentFilter getDocumentFilter() {
          //  return new IntegerDocumentFilter();
          //}
          @Override
          public Object stringToValue(String text) throws ParseException {
             JFormattedTextField f = getFormattedTextField();
             try{
               Long.parseLong(text);
             }catch(NumberFormatException e) {
               f.setBackground(color);
               throw new ParseException("xxx", 0);
             }
             Object o = format.parse(text);
             //System.out.println(o);
             if(o instanceof Long) {
               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) {
                 f.setBackground(color);
                 throw new ParseException("xxx", 0);
               }else{
                 f.setBackground(Color.WHITE);
               }
               return val;
             }
             throw new ParseException("xxx", 0);
          }
        };
        //editFormatter.setAllowsInvalid(false);
        //editFormatter.setCommitsOnValidEdit(true);
        editFormatter.setValueClass(Long.class);
        return new DefaultFormatterFactory(displayFormatter, displayFormatter, editFormatter);
      }
      

参考リンク

コメント