• 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?id=1TPoA7k0gp-SsdcPNfoTDKvN4bZikpOkgrA

概要

JSpinnerSpinnerDateModelを設定し、スピンボタンをクリックした際の増減サイズを各日付フィールドごとに指定します。

サンプルコード

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

参考リンク

コメント