|
Spinner |
||||
新しいコンポーネント |
||||
スピナは Java2 SE, v1.4 で新しくできた Swing コンポーネントです。 Windows のユーザだと、下図のような時間を設定するダイアログを見たことありますよね。
この図の中で赤丸で示した部分がスピナです。 今までこれと同じようなコンポーネントを Swing で作ろうとしたら、JTextField と 2 つの JButton を組み合わせて作るしかありませんでしたが、スピナができたので簡単に作れるようになりました。でも、Visual Basic や Visual C++ では使えて当然だったのですから、やっと追いついたという感じですね。
|
なにはともあれ使ってみる | ||||||||||||||||||||
使い方は簡単です。なにも考えずに使ってみた例が SpinnerTest1.java です。
スピナは Swing では JSpinner というクラスになります。SpinnerTest1 は JSpinner オブジェクトを引数なしで生成して、Applet に貼ってみただけです。
JSpinner クラスは引数なしのコンストラクタでオブジェクトを生成すると、数字が編集できて初期値が 0 のスピナを生成します。 数字以外のものや、初期値が 0 以外の場合は、JSpinner オブジェクトを生成するときに指定しなければいけません。そのときの指定の方法ですが、モデルを用意します。 Swing ではコンポーネントが表示する情報はモデルが持っています。例えば、JTable クラスであれば TableModel クラスになります。同じように JSpinner クラスも SpinnerModel クラスで表示する情報を保持させます。 モデルには表示する情報の違いにより 3 種類用意されています。
この 3 種類のモデルを使ってみたのが SpinnerTest2.java です。
SpinnerTest2 では 3 つのスピナを作っています。それぞれ makeNumberSpinner メソッド、makeListSpinner メソッド、makeDateSpinner メソッドで生成しています。
赤色で示したところが、モデルを生成している部分です。JSpinner でモデルを指定する場合は、モデルを引数にして生成します(4, 17, 24 行目。 3 行目では数字を表す SpinnerNumberModel オブジェクトを生成しています。引数は順に初期値、最小値、最大値、ステップで引数の型は int となります。ですから、ここでは
となりモデルを生成しています。 SpinnerNumberModel は int 型以外にも double 型、Number 型のコンストラクタがありますが、引数の順番と意味は int 型のときと同じです。 次が SpinnerListModel クラスです。SpinnerListModel クラスははじめから選択肢を決めておきます。9 行目から 14 行目が選択肢を作っている部分です。作成した List オブジェクトの選択肢を引数として SpinnerListModel オブジェクトを生成します (16 行目)。 SpinnerListModel クラスは List クラス以外に Object[] (Object 型の配列) を引数にとるコンストラクタもあります。 最後が日づけを表す SpinnerDateModel クラスです。 SpinnerDateModel クラスのコンストラクタは初期値、開始日時、終了日時、編集できる部分を引数で指定します。開始日時と終了日時を指定しない場合は null にしておきます。 最後の編集できる部分ですが、ここには年、月、日などを指定するのですが、Calendar クラスの定数を利用します。使える定数は次のどれかです。
23 行目では分を表す Calendar.MINUTE を指定しているので、分が編集可能になります。
|
見た目を変える |
||||||||||||||||
基本的な JSpinner クラスの使い方は分かりましたが、もう少しカスタマイズしてみましょう。 JSpinner が表示する情報をもっているのはモデルでしたが、表示に関してはエディタが担当します。SpinnerModel に対応する 3 つのエディタがあります。
JSpinner.ListEditor はほとんどカスタマイズすることはできないので、それ以外の JSpinner.NumberEditor と JSpinner.DateEditor について行ってみましょう。 通常、数字を整形して出力する場合 java.text.DecimalFormat クラスを用います。JSpinner.NumberEditor クラスでは DecimalFormat クラスを内部的に呼び出しているので、DecimalFormat クラスで使用しているフォーマットを使うことができます。 同様に日にちを出力するときは、java.text.SimpleFormat クラスを使用します。JSpinner.DateEditor も SimpleFormat クラスのフォーマットを使用することができます。 これらのフォーマットを利用するにはエディタクラスのコンストラクタの引数で指定することで可能になります。整形した形で出力するようにしたのが SpinnerTest3.java です。
エディターは第 1 引数に JSpinner オブジェクト、第 2 引数にフォーマットを指定します。エディタを JSpinner にセットするには setEditor メソッドを使用します。
ここで使用しているフォーマット "#,#00" は、最低限 2 桁を出力して、3 桁目と 4 桁目の間にカンマを入れるようにするということを示しています。少なくとも、2 桁出力するので、0 や 5 の時でも、00, 05 と出力されます。また、1000 は 1,000 と出力されます。フォーマットの詳細は DecimalFormat クラスの JavaDoc をご覧ください。
日づけのフォーマットはロケールによって異なります。そのため、フォーマット指定してもロケールによって出力結果は異なります。例えば G は日本であれば "西暦"、アメリカだと "AC" と出力されます。フォーマットの詳細は SimpleDateFormat の JavaDoc を参照してください。 このようにエディタのフォーマットを指定したのですが、日にちの方はいまいちちゃんと動作してくれませんでした。一度 TextField にフォーカスすればちゃんとフォーマット通り出力されるのですが、なにもしないとデフォルトになってしまいます。 まだ、ベータ版なのでバグが残っているのかもしれません。正式版までには直ってほしいですね。
|
JSpinner のイベント |
|||||||
さて、次は JSpinner クラスのイベントです。 JSpinner クラスで発生するイベントは、値が変わったときに発生する javax.swing.event.ChangeEvent クラスです。ChangeEvent クラスに対応するリスナは javax.swing.event.ChangeListener インタフェースで、メソッドは stateChanged の 1 つだけです。 イベントも簡単なサンプルを作ってみました。
JSpinner オブジェクトと JLabel オブジェクトを並べて、JSpinner オブジェクトの ChangeEvent が発生したら、JLabel オブジェクトの表示を更新させるという Applet です。
JLabel オブジェクトの label と JSpinner オブジェクトの spinner は、Anonymous Class から使用できるようにプロパティにしました。 イベントのリスナ登録は 13 から 17 行目で行っています。リスナは Anonymous Class で、spinner から getValue メソッドで値を取得して、それを JLabel クラスの setText メソッドを使用して表示の更新を行っています (15 行目)。 JSpinner には値を取得するためのメソッド getValue 以外に、現在の値の次の選択肢を取得する getNextValue メソッド、同様に前の選択肢の getPreviousValue メソッドがあります。 今回使用したサンプルはここからダウンロードできます。 参考 URL
(Aug. 2001) |
|