数値データの表示形式を設定する
データモデルとしてSpinnerNumberModelクラスを使用した場合に、スピナーに表示される数値データの表示形式を設定する方法を確認します。
スピナーでは表示形式を管理するエディタクラスが用意されています。ベースとなる「JSpinner.DefaultEditor」クラス。そのサブクラスである「JSpinner.DateEditor」クラス「JSpinner.ListEditor」クラス「JSpinner.NumberEditor」クラスです。ここでは数値データを扱う時に利用する「JSpinner.NumberEditor」クラスについて見ていきます。
JSpinner.NumberEditorクラスの定義を確認します。クラス図は次のようになっています。
java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JPanel javax.swing.JSpinner.DefaultEditor javax.swing.JSpinner.NumberEditor public static class JSpinner.NumberEditor extends JSpinner.DefaultEditor
JSpinner.NumberEditorクラスはJSpinner.DefaultEditorクラスのサブクラスとなっています。JSpinner.DefaultEditorクラス自体はJPanelクラスのサブクラスです。
JSpinner.NumberEditorクラスのコンストラクタ
JSpinner.NumberEditorクラスをを利用するにはコンストラクタを使ってJSpinner.NumberEditorクラスのオブジェクトを作成します。どのようなコンストラクタが用意されているか確認してみます。
コンストラクタ |
---|
JSpinner.NumberEditor(JSpinner spinner) JFormattedTextField での SpinnerNumberModel の値の表示、編集をサポートする JSpinner エディタを構築します。 |
JSpinner.NumberEditor(JSpinner spinner, String decimalFormatPattern) JFormattedTextField での SpinnerNumberModel の値の表示、編集をサポートする JSpinner エディタを構築します。 |
コンストラクタは2つ用意されています。通常はフォーマットを合わせて指定する2番目のコンストラクタを使用します。
では2番目のコンストラクタを確認してみます。
public JSpinner.NumberEditor(JSpinner spinner, String decimalFormatPattern)
JFormattedTextField での SpinnerNumberModel の値の表示、編集をサポートす る JSpinner エディタを構築します。この NumberEditor は、スピナーの ChangeListener および新しい JFormattedTextField の PropertyChangeListener の両方になります。 パラメータ: spinner - このエディタが監視するスピナーモデル decimalFormatPattern - テキストフィールドの値の表示と解析に使用する DecimalFormat オブジェクトの 初期パターン 例外: IllegalArgumentException - スピナーモデルが SpinnerNumberModel のイン スタンスでないか、 decimalFormatPattern が DecimalFormat の正当な引 数でない場合
1番目の引数にエディタの対象となるJSpinnerクラスのオブジェクトを設定します。
2番目の引数には表示形式を表す文字列を指定します。JSpinner.NumberEditorクラスではデータの表示にJFormattedTextFieldクラスを使用しています。JFormattedTextFieldクラスでは引数にフォーマットを表すクラスのオブジェクトを指定しますがJSpinner.NumberEditorクラスではDecimalFormatクラスを利用して表示形式を設定します。
2番目の引数に設定された文字列はDecimalFormatクラスのコンストラクタに引き渡される値となりますので、DecimalFormatクラスで設定可能なフォーマット形式で指定して下さい。
※DecimalFormatクラスについては『JFormattedTextFieldクラス』を参照して下さい。
実際の使い方は次のようになります。
SpinnerNumberModel model = new SpinnerNumberModel(2000, null, null, 100); JSpinner spinner = new JSpinner(model); JSpinner.NumberEditor editor = new JSpinner.NumberEditor(spinner, "#,##0");
スピナーにエディタを設定する
作成したエディタをスピナーに設定する方法を確認します。JSpinnerクラスで用意されている「setEditor」メソッドを使います。
public void setEditor(JComponent editor)
SpinnerModel の現在の値を表示する JComponent を変更します。このメソッド により、古いエディタがモデルから切り離され、新しいエディタが接続されま す。これは、古いエディタの ChangeListener をモデルまたはスピナー自体か ら削除して、新しいエディタの変更リスナーを追加することを意味します。 パラメータ: editor - 新しいエディタ 例外: IllegalArgumentException - エディタが null の場合
引数にはエディタであるJComponetクラスのオブジェクトを設定します。今回はJComponetクラスのサブクラスであるJSpinner.NumberEditorクラスのオブジェクトを設定します。
実際の使い方は次のようになります。
SpinnerNumberModel model = new SpinnerNumberModel(2000, null, null, 100); JSpinner spinner = new JSpinner(model); JSpinner.NumberEditor editor = new JSpinner.NumberEditor(spinner, "#,##0"); spinner.setEditor(editor);
サンプルプログラム
では簡単なサンプルを作成して試してみます。
import javax.swing.*; import java.awt.Dimension; import java.awt.BorderLayout; public class JSpinnerTest17 extends JFrame{ public static void main(String[] args){ JSpinnerTest17 frame = new JSpinnerTest17(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JSpinnerTest17(){ SpinnerNumberModel model = new SpinnerNumberModel(2000, null, null, 100); JSpinner spinner = new JSpinner(model); JSpinner.NumberEditor editor = new JSpinner.NumberEditor(spinner, "#,##0"); spinner.setEditor(editor); spinner.setPreferredSize(new Dimension(150, 25)); JPanel p = new JPanel(); p.add(spinner); getContentPane().add(p, BorderLayout.CENTER); } }
上記をコンパイルした後で実行すると次のように表示されます。
今回は3桁毎にカンマで区切るようなフォーマットを設定してあります。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。