JSpinnerに設定したSpinnerDateModelの各日付フィールドに増減サイズを指定する
Total: 2787
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JSpinner
にSpinnerDateModel
を設定し、スピンボタンをクリックした際の増減サイズを各日付フィールドごとに指定します。
Screenshot
Advertisement
サンプルコード
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());
int calendarField = getCalendarField();
int 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());
int calendarField = getCalendarField();
int stepSize = Optional.ofNullable(stepSizeMap.get(calendarField)).orElse(1);
cal.add(calendarField, stepSize);
Date next = cal.getTime();
return next;
}
});
View in GitHub: Java, Kotlin解説
Calendar.MINUTE
やCalendar.SECOND
などの各日付フィールドごとに増加、減少のステップサイズを指定したHashMap
を作成SpinnerDateModel#getNextValue()
とSpinnerDateModel#getPreviousValue()
の内部でこのHashMap
を参照してJSpinner
のスピンボタンなどでの値変更に利用- 上記のサンプルでは秒フィールドにカーソルがある場合は
30
秒、ミリ秒の場合は500
ミリ秒、マッピングされていないフィールドの場合は1
ずつ増減
- 上記のサンプルでは秒フィールドにカーソルがある場合は