概要

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

サンプルコード

final String dateFormatPattern = "yyyy/MM/dd";
JSpinner s = new JSpinner(
    new SpinnerDateModel(date, start, null, Calendar.DAY_OF_MONTH));
final JSpinner.DateEditor editor = new JSpinner.DateEditor(s, dateFormatPattern);
s.setEditor(editor);
editor.getTextField().addFocusListener(new FocusAdapter() {
  @Override public void focusGained(FocusEvent e) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        int i = dateFormatPattern.lastIndexOf("dd");
        editor.getTextField().select(i, i + 2);
      }
    });
  }
});
view all

解説

  • 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
    • フォーカスがエディタに移動した場合、日付部分が選択状態になるようリスナーを設定

参考リンク

コメント