Java 2 SDKの最新リリースである1.4 beta版は、2つの強力な新コンポーネントをJFC/Swingのコンポーネント・セットに追加するものです。そのうちの1つであるJSpinner を使用すれば、ユーザーがピック・リストから容易に日付、数値、および選択肢を選べるようになります。(もう1つは、フォーマットされた入力のサポートを行うJFormattedTextField です。)
JSpinner を使用すると、図1に示されるように、選択ボックスに1つずつ表示される、値でソートされたリストを作成することができます。ユーザーは、上/ 下の矢印をクリックして選択を行います。
図1. JSpinnerの例
ユーザーは、コンポーネントあるいはキーボード上にある上 / 下の矢印を使用して選択を行います。また、ユーザーは選択項目をタイプ入力することもできます。しかし、JComboBox とは異なり、JSpinner はドロップダウン・リストを提供していないので、選択項目とその順番は分かりやすいものにしてください。
クラスを使用するには、まず選択が行われるエレメントの集合を (List あるいは配列内に) 作成し、次にリストからSpinnerModel を作成し、そのモデルに対するJSpinner を作成するだけでよいのです。
リスト1. 簡単なJSpinnerの使用法
String[] months = new DateFormatSymbols().getMonths();
SpinnerModel model = new SpinnerListModel(months);
JSpinner spinner = new JSpinner(model);
|
目的の入力タイプによって、このコンポーネントについてデータ・モデルを作成するヘルパー・クラスが数種類用意されています。
-
SpinnerDateModel: 日付の入力を読みこむために使用されます。このクラスはCalendarクラスの定数を使用した異なる設定による日付の変更をサポートしています。たとえば、一度に1週間日付を変更するには、Calendar.WEEK_OF_MONTHを使います。
-
SpinnerListModel: 値のリストからの入力を読みこむために使用されます。
-
SpinnerNumberModel: 設定されたステップ・サイズ付きの数値の範囲 (int型あるいはdouble型) からの入力を読みこむために使用されます。
それぞれのSpinnerModel の実装では、エディターを使用して値を入力します。エディターはJComponent でなければなりません。システムで定義されたエディターで、JSpinner.DefaultEditor のサブクラスに属するものです。それぞれのモデルに対して以下の1つが選択可能です。
-
JSpinner.DateEditor:SpinnerDateModelのためのエディター。日付の入力フォーマットをカスタマイズすることができます。
-
JSpinner.ListEditor:SpinnerListModelのためのエディター。値の位置を特定するために先行入力をサポートします。
-
JSpinner.NumberEditor:SpinnerNumberModelのためのエディター。10進法のフォーマット・パターンをカスタマイズすることができます。
図2に示されているのは、このクラス間 (およびプラスアルファ) の関係です。
図2. JSpinner UMLの関係を示すダイアグラム
JSpinner コンポーネントは、他のSwingコンポーネントと同様に機能します。ユーザーが選択項目を変更するのを捕えたいのであれば、リスナーを接続してください。JSpinner の場合、対応するリスナーはChangeListener であり、これはJSpinner あるいはそのSpinnerModel に直接接続することができます。リスナーは、JSpinnerまたはそのSpinnerModelのいずれにも接続できますが、値が変更された場合のChangeEvent のソースは、常にSpinnerModel です。
リスト2. JSpinnerのイベント・リスニング
ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
SpinnerModel source = (SpinnerModel)e.getSource();
System.out.println("The value is: " + source.getValue());
}
};
model.addChangeListener(listener);
|
3つの異なるspinnerモデルのすべてを使用する例を見てみましょう (リスティング3)。このリスト・モデルは、DateFormatSymbols クラスから取得された月の名称のセットを使用します。日付モデルの例では、エディターの入力フォーマットを変更します。(ベータ版には、エディターが変更されてもフィールドの書式を変更しないというバグがあるようです。)また、フィールドに隣接する矢印を使用している場合、日付を1度に1週間分変更します。数値モデルの例では、ユーザーは矢印を使用して、0から100までの数値で5つ刻みの数字を選ぶことができます。ユーザーは、5の倍数に限らず、いかなる数値も入力できることに注意してください。
すべてのコンポーネントに対して、それぞれのspinner値が実際に変更された場合に表示をする、同じ変更リスナーが接続されます。カーソル・キーを使用して月、日、あるいは年を変更する場合、Enterキーを押すまで、値は変わりません。
リスト3. JSpinnerの完全な例
import javax.swing.*;
import javax.swing.event.*;
import java.text.*;
import java.awt.*;
import java.util.*;
public class Spinner {
public static void main (String args[]) throws Exception {
JFrame frame = new JFrame("Spinner");
frame.setDefaultCloseOperation(3);
String[] months = new DateFormatSymbols().getMonths();
SpinnerModel model = new SpinnerListModel(months);
JSpinner spinner = new JSpinner(model);
frame.getContentPane().add(spinner, BorderLayout.NORTH);
SpinnerDateModel model2 = new SpinnerDateModel();
model2.setCalendarField(Calendar.WEEK_OF_MONTH);
JSpinner spinner2 = new JSpinner(model2);
JSpinner.DateEditor editor2 = new JSpinner.DateEditor(
spinner2, "MMMMM dd, yyyy");
spinner2.setEditor(editor2);
frame.getContentPane().add(spinner2, BorderLayout.SOUTH);
SpinnerNumberModel model3 = new SpinnerNumberModel(50, 0, 100, 5);
JSpinner spinner3 = new JSpinner(model3);
frame.getContentPane().add(spinner3, BorderLayout.CENTER);
ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
SpinnerModel source = (SpinnerModel)e.getSource();
System.out.println("The value is: " + source.getValue());
}
};
model.addChangeListener(listener);
model2.addChangeListener(listener);
model3.addChangeListener(listener);
frame.pack();
frame.show();
}
}
|
- JSpinnerを試しに使ってみてください。本記事で使用したソース・ファイル をダウンロードしてください。
- 公式リリース1.4のドキュメンテーション「JSpinner -- A Simple Sequence Container」 、
JSpinnerコンポーネントのプレビューをお読みください。 -
javadoc を利用して、
JSpinnerの使用法を学習してください。 -
javadoc を使用して、
JFormattedTextFieldの使用法を学習してください。 - Javaリソースについては、developerWorks Javaゾーン を参照してください。

John Zukowskiは、JZ Ventures, Inc.の戦略的Javaコンサルティングを推進し、数多くのjGuruのコミュニティー主導のJava FAQsで常任指導者として活躍しています。最新の著書には、Apressから出版された「 Java Collections」および「 Definitive Guide to Swing for Java 2」 (第2版) があります。彼のメール・アドレスはjaz@zukowski.net です。