数値データの表示形式を設定する

広告

データモデルとして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番目のコンストラクタを確認してみます。

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」メソッドを使います。

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);

サンプルプログラム

では簡単なサンプルを作成して試してみます。

JSpinnerTest17.java

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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。