---
category: swing
folder: CalendarFieldStepSize
title: JSpinnerに設定したSpinnerDateModelの各日付フィールドに増減サイズを指定する
tags: [JSpinner, SpinnerDateModel, Calendar]
author: aterai
pubdate: 2017-02-27T15:54:24+09:00
description: JSpinnerにSpinnerDateModelを設定し、スピンボタンをクリックした際の増減サイズを各日付フィールドごとに指定します。
image: https://drive.google.com/uc?export=view&id=1TPoA7k0gp-SsdcPNfoTDKvN4bZikpOkgrA
---
* 概要 [#summary]
`JSpinner`に`SpinnerDateModel`を設定し、スピンボタンをクリックした際の増減サイズを各日付フィールドごとに指定します。

#download(https://drive.google.com/uc?export=view&id=1TPoA7k0gp-SsdcPNfoTDKvN4bZikpOkgrA)

* サンプルコード [#sourcecode]
#code(link){{
HashMap<Integer, Integer> stepSizeMap = new HashMap<>();
stepSizeMap.put(Calendar.HOUR_OF_DAY, 1);
stepSizeMap.put(Calendar.MINUTE,      1);
stepSizeMap.put(Calendar.SECOND,      30);
stepSizeMap.put(Calendar.MILLISECOND, 500);
JSpinner spinner2 = new JSpinner(new SpinnerDateModel(d, null, null, Calendar.SECOND) {
  @Override public Object getPreviousValue() {
    Calendar cal = Calendar.getInstance();
    cal.setTime(getDate());
    Integer calendarField = getCalendarField();
    Integer stepSize = Optional.ofNullable(stepSizeMap.get(calendarField)).orElse(1);
    cal.add(calendarField, -stepSize);
    Date prev = cal.getTime();
    return prev;
  }
  @Override public Object getNextValue() {
    Calendar cal = Calendar.getInstance();
    cal.setTime(getDate());
    Integer calendarField = getCalendarField();
    Integer stepSize = Optional.ofNullable(stepSizeMap.get(calendarField)).orElse(1);
    cal.add(calendarField, stepSize);
    Date next = cal.getTime();
    return next;
  }
});
}}

* 解説 [#explanation]
- `Calendar.MINUTE`や`Calendar.SECOND`などの各日付フィールドごとに増加、減少のステップサイズを指定した`HashMap`を作成
- `SpinnerDateModel#getNextValue()`と`SpinnerDateModel#getPreviousValue()`の内部で、この`HashMap`を参照して`JSpinner`のスピンボタンなどでの値変更に利用
-- 上記のサンプルでは、秒フィールドにカーソルがある場合は`30`秒、ミリ秒の場合は`500`ミリ秒、マッピングされていないフィールドの場合は`1`ずつ増減

//* 参考リンク [#reference]
* コメント [#comment]
#comment
#comment