概要

JSpinnerに、下限値を設定したSpinnerDateModelを設定して、日付の変更をテストします。

サンプルコード

String dateFormat= "yyyy/MM/dd";
JSpinner s = new JSpinner(
    new SpinnerDateModel(date, start, null, Calendar.DAY_OF_MONTH));
JSpinner.DateEditor editor = new JSpinner.DateEditor(s, dateFormat);
s.setEditor(editor);
editor.getTextField().addFocusListener(new FocusAdapter() {
  @Override public void focusGained(FocusEvent e) {
    EventQueue.invokeLater(() -> {
      int i = dateFormat.lastIndexOf("dd");
      editor.getTextField().select(i, i + 2);
    });
  }
});
View in GitHub: Java, Kotlin

解説

  • Calendar.DAY_OF_MONTH
    • 本日を現在の値と下限値、上限値はnull(制限無し)、増減値をCalendar.DAY_OF_MONTHとしたSpinnerDateModelを使用
      • 下限値が現在時刻(例: Mon Aug 22 15:09:27 JST 2011)なので現在の値(Mon Aug 22 00:00:00 JST 2011)が範囲外となり矢印ボタンで日付を変更できない
      • 参考: Swing - DateSpinner spins only after an edit
  • min: set(Calendar.HOUR_OF_DAY, 0)
    • 下限値を以下のように本日の始めにリセット
      • 例: Mon Aug 22 15:09:27 JST 2011Mon Aug 22 00:00:00 JST 2011
        Calendar today = Calendar.getInstance();
        today.clear(Calendar.MILLISECOND);
        today.clear(Calendar.SECOND);
        today.clear(Calendar.MINUTE);
        today.set(Calendar.HOUR_OF_DAY, 0);
        Date start = today.getTime();
        
        System.out.println(date);
        System.out.println(start);
        
        JSpinner spinner2 = new JSpinner(new SpinnerDateModel(
            date, start, null, Calendar.DAY_OF_MONTH));
        spinner2.setEditor(new JSpinner.DateEditor(spinner2, dateFormatPattern));
        
  • JSpinner.DateEditor + FocusListener
    • フォーカスがエディタに移動した場合、日付部分が選択状態になるようFocusListenerを設定

参考リンク

コメント