Swing/NumberFormatter のバックアップ差分(No.7)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/NumberFormatter へ行く。
- 1 (2010-03-09 (火) 19:41:17)
- 2 (2010-03-09 (火) 22:15:51)
- 3 (2011-09-27 (火) 21:41:33)
- 4 (2012-10-19 (金) 20:17:41)
- 5 (2013-01-02 (水) 14:25:13)
- 6 (2014-11-01 (土) 00:46:09)
- 7 (2014-12-25 (木) 16:37:08)
- 8 (2015-03-11 (水) 18:29:49)
- 9 (2017-01-19 (木) 11:20:28)
- 10 (2017-11-02 (木) 15:34:40)
- 11 (2017-12-17 (日) 14:30:28)
- 12 (2019-12-11 (水) 21:08:39)
- 13 (2021-06-10 (木) 20:48:00)
- 14 (2022-08-20 (土) 22:15:25)
- 15 (2023-05-09 (火) 12:31:40)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- title: JSpinnerで無効な値の入力を許可しない tags: [JSpinner, JFormattedTextField, SpinnerNumberModel, DocumentListener, NumberFormatter] author: aterai pubdate: 2010-03-08T15:39:14+09:00 description: JSpinnerからJFormattedTextFieldを取得し、これに無効な値の入力を許可しないように設定します。 --- * 概要 [#hb960cf3] `JSpinner`から`JFormattedTextField`を取得し、これに無効な値の入力を許可しないように設定します。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQg6Td8tI/AAAAAAAAAfs/u5mXLfk3k64/s800/NumberFormatter.png) * サンプルコード [#d07eefaa] #code(link){{ JSpinner.NumberEditor editor = (JSpinner.NumberEditor)spinner.getEditor(); DefaultFormatter formatter = (DefaultFormatter) editor.getTextField().getFormatter(); formatter.setAllowsInvalid(false); }} * 解説 [#rb11baf0] 上記のサンプルでは、`DefaultFormatter#setAllowsInvalid(false)`などを設定した`DefaultFormatterFactory`を作成して、`JSpinner`から取得した`JFormattedTextField`に`setFormatterFactory`で追加しています。 - 上 -- `SpinnerNumberModel`を設定した通常の`JSpinner` -- 別コンポーネントにフォーカスが移動するときに、値が有効か無効かを判断 - 中 -- `SpinnerNumberModel`を設定し、数値以外の無効な文字入力ができないようにした`JSpinner` - 下 -- `SpinnerNumberModel`を設定した通常の`JSpinner` -- 別コンポーネントにフォーカスが移動するときに、値が有効か無効かを判断 -- 無効な値の場合は、背景色を変更 #code{{ private static JSpinner makeSpinner2(SpinnerNumberModel m) { JSpinner s = new JSpinner(m); JSpinner.NumberEditor editor = (JSpinner.NumberEditor)s.getEditor(); final JFormattedTextField ftf = (JFormattedTextField)editor.getTextField(); ftf.setFormatterFactory(makeFFactory(m)); ftf.getDocument().addDocumentListener(new DocumentListener() { private final Color color = new Color(255,200,200); @Override public void changedUpdate(DocumentEvent e) { updateEditValid(); } @Override public void insertUpdate(DocumentEvent e) { updateEditValid(); } @Override public void removeUpdate(DocumentEvent e) { updateEditValid(); } private void updateEditValid() { EventQueue.invokeLater(new Runnable() { @Override public void run() { ftf.setBackground(ftf.isEditValid()?Color.WHITE:color); } }); } }); 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) { @Override public Object stringToValue(String text) throws ParseException { try{ Long.parseLong(text); }catch(NumberFormatException e) { throw new ParseException("xxx", 0); } Object o = format.parse(text); 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) { throw new ParseException("xxx", 0); } return val; } throw new ParseException("xxx", 0); } }; //editFormatter.setAllowsInvalid(false); //editFormatter.setCommitsOnValidEdit(true); editFormatter.setValueClass(Long.class); return new DefaultFormatterFactory(displayFormatter, displayFormatter, editFormatter); } }} * 参考リンク [#w7e4185e] - [[JTextFieldの入力を数値に制限する>Swing/NumericTextField]] * コメント [#h6eb49c7] #comment - 無効な値が入力されたときの背景色の変更を`DocumentListener`で行うように修正。 -- &user(aterai); &new{2011-09-27 (火) 21:52:05}; - メモ: [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6423494 Bug ID: 6423494 SpinnerNumberModel should use getMinimum and getMaximum instead of fields]、[[SpinnerNumberModelに上限値を超える値を入力>Swing/SpinnerNumberModel]] -- &user(aterai); &new{2011-09-27 (火) 22:12:46}; - メモ: [http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6423494 Bug ID: 6423494 SpinnerNumberModel should use getMinimum and getMaximum instead of fields]、[[SpinnerNumberModelに上限値を超える値を入力>Swing/SpinnerNumberModel]] -- &user(aterai); &new{2011-09-27 (火) 22:12:46}; #comment