Swing/NumberFormatter のバックアップ(No.15)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- category: swing folder: NumberFormatter title: JSpinnerで無効な値の入力を許可しない tags: [JSpinner, JFormattedTextField, SpinnerNumberModel, DocumentListener, NumberFormatter] author: aterai pubdate: 2010-03-08T15:39:14+09:00 description: JSpinnerからJFormattedTextFieldを取得し、これに無効な値の入力を許可しないように設定します。 image:
概要
JSpinner
からJFormattedTextField
を取得し、これに無効な値の入力を許可しないように設定します。
Screenshot
Advertisement
サンプルコード
JSpinner.NumberEditor editor = (JSpinner.NumberEditor) spinner.getEditor();
JFormattedTextField.AbstractFormatter formatter = editor.getTextField().getFormatter();
if (formatter instanceof DefaultFormatter) {
((DefaultFormatter) formatter).setAllowsInvalid(false);
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、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();
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) {
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);
}