初期値や上限/下限を設定する
SpinnerDateModelクラスのデフォルトコンストラクタを使用するとアプリケーションを実行した現時刻が初期値として表示されます。別の値を初期値として表示したり上限や下限を設定するには次のコンストラクタを使用して明示的に指定する必要があります。
SpinnerDateModel
public SpinnerDateModel(Date value,
                        Comparable start,
                        Comparable end,
                        int calendarField)
start から end までの日付のシーケンスを表す SpinnerDateModel を作成しま
す。nextValue メソッドと previousValue メソッドは、現在の日付である 
value を calendarField のタイムユニット分前進または後退させて、シーケン
スの要素を計算します。Calendar field の増加または減少についての詳細は、
java.util.Calendar の add メソッドを参照してください。
シーケンスの範囲に上限または下限のないことを示すために、start パラメータ
と end パラメータを null にすることができます。value または calendarField
が null の場合、あるいは start と end の両方が指定されており、
mininum > maximum の場合、IllegalArgumentException がスローされます。同様
に、(minimum <= value <= maximum) が false の場合も、
IllegalArgumentException がスローされます。 
パラメータ:
  value - モデルの現在の値 (null 以外)
  start - シーケンスの先頭の日付または null
  end - シーケンスの最後の日付または null
  calendarField - 次のいずれか(後述)
例外: 
  IllegalArgumentException - value または calendarField が null の場合、
    calendarField が有効でない場合、 または (start <= value <= end) が
    false である場合
			1番目の引数にスピナーに設定する値をDateクラスのオブジェクトで指定します。現在の日時を設定するには次のように記述します。
Date initDate = new Date();
日付を指定して作成する場合にはCalendarクラスを利用して次のように記述します。
Calendar calendar = Calendar.getInstance(); calendar.set(2007, 3, 1, 12, 0); Date initDate = calendar.getTime();
※Calendarクラスについては『Calendarクラス』を参照して下さい。
2番目の引数に値として取り得る最小値をDateクラスのオブジェクトで設定します。もし最小値の制限を設定しない場合には「null」を設定して下さい。3番目の引数には最大値をDateクラスのオブジェクトで設定します。最大値を設定しない場合には「null」を設定して下さい。(定義上はComparableインタフェースを実装したクラスとなっていますがDateクラスはComparableインタフェースを実装したクラスです)。
4番目の引数にはボタンをクリックした時に変化する値の幅をCalendarクラスの定数を使って指定します。指定できる値は次のいずれかとなります。(前頁でも書いたのですが、ここで指定した値が意味を持っていませんでした。詳細が分かり次第更新します)。
| 値 | 意味 | 
|---|---|
| Calendar.ERA | ユリウス暦の AD または BC などの年代を示します。 | 
| Calendar.YEAR | 年を示すフィールド値です。 | 
| Calendar.MONTH | 月を示すフィールド値です。 | 
| Calendar.WEEK_OF_YEAR | 現在の年の何週目かを示します。 | 
| Calendar.WEEK_OF_MONTH | 現在の月の何週目かを示します。 | 
| Calendar.DAY_OF_MONTH | 月の日を示します。 | 
| Calendar.DAY_OF_YEAR | 現在の年の何日目かを示します。 | 
| Calendar.DAY_OF_WEEK | 曜日を示します。 | 
| Calendar.DAY_OF_WEEK_IN_MONTH | 現在の月の何度目の曜日かを示します。 | 
| Calendar.AM_PM | HOUR が正午より前であるか後であるかを示します。 | 
| Calendar.HOUR | 午前または午後の何時かを示します。 | 
| Calendar.HOUR_OF_DAY | 時刻を示します。 | 
| Calendar.MINUTE | 分を示します。 | 
| Calendar.SECOND | 秒を示します。 | 
| Calendar.MILLISECOND | ミリ秒を示します。 | 
実際の使い方は次のようになります。
Calendar calendar = Calendar.getInstance(); calendar.set(2007, 3, 1, 12, 0); Date initDate = calendar.getTime(); calendar.set(2007, 2, 1, 12, 0); Date startDate = calendar.getTime(); calendar.set(2007, 4, 1, 12, 0); Date endDate = calendar.getTime(); SpinnerModel model = new SpinnerDateModel(initDate, startDate, endDate, Calendar.HOUR);
サンプルプログラム
では簡単なサンプルを作成して試してみます。
import javax.swing.*;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.util.Date;
import java.util.Calendar;
public class JSpinnerTest15 extends JFrame{
  public static void main(String[] args){
    JSpinnerTest15 frame = new JSpinnerTest15();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }
  JSpinnerTest15(){
    Calendar calendar = Calendar.getInstance();
    calendar.set(2007, 3, 1, 12, 0);
    Date initDate = calendar.getTime();
    calendar.set(2007, 2, 1, 12, 0);
    Date startDate = calendar.getTime();
    calendar.set(2007, 4, 1, 12, 0);
    Date endDate = calendar.getTime();
    SpinnerModel model = 
      new SpinnerDateModel(initDate, startDate, endDate, Calendar.HOUR);
    JSpinner spinner = new JSpinner(model);
    spinner.setPreferredSize(new Dimension(150, 25));
    JPanel p = new JPanel();
    p.add(spinner);
    getContentPane().add(p, BorderLayout.CENTER);
  }
}
			上記をコンパイルした後で実行すると次のように表示されます。
			
			
指定した日時が表示されます。今回は最大値を1ヵ月後、最小値を1ヶ月前に設定しています。
では日の箇所をクリックしてからボタンをクリックして値を変更して下さい。(年の箇所は最大及び最小の範囲を超えてしまうので動かせません)。
			
			
			
			
( Written by Tatsuo Ikura )
				著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。