表示変換クラス

表示変換クラスとは、内部保持データ ⇔ 表示文字 の変換処理を行うクラスになります。
例えば、内部保持データ では 「123456789」 と保持している情報を、表示上では 「123,456,789」 と桁数カンマ区切り で 表示する事などが可能です。

表示変換クラス は、Data Management Consoleのデータ単位にて設定を行います。
例えば、桁数カンマ区切り の 単価 のデータをData Management Consoleにて作成すれば、そのデータを参照する各画面はフォーマット形式を 意識することなく実装が可能です。 また、フォーマット変更についても データ の属性を変えることにより全ての画面に反映されます。

補足補足
標準提供の表示変換クラスは全てString型オブジェクトにて格納しています。 String型以外のオブジェクトにて格納するためには表示変換クラスを独自作成する必要があります。

表示変換クラスを指定することにより、編集後にフォーマット変換を自動的に行うことができます。
例えば、テキストフィールドに日付のフォーマット(yyyy/mm/dd)を指定した場合、 「20001231」と入力しフォーカスを移動すると「2000/12/31」と自動的に変換され表示されます。 また、再度フォーカスを当てると入力した状態「2001231」と表示されます。
つまりSwingJTableのレンダラ・エディタの動きを、テーブルのみならずテキストフィールドなどにも使用が可能になります。

MaskFormat を使用した場合、入力された文字 を元に 内部保持データ を作成し格納する事も可能です。 たとえば、「123456789」と入力された場合 BigDecimal型のオブジェクトに格納し、表示時には BigDecimal型から 文字列を生成して 渡す ようなことも可能です。
MaskFormatは 表示コンポーネント を DefaultFormattedTextField もしくは FormattedEditorComboBox のみ動作します。

1. 表示変換クラス機能

表示変換クラスには大きく分けて2つの機能があります。

  1. Formatクラス
    入力時には数値のみを続けて入力するが、フォーカス移動後(入力完了後)は 見やすいフォーマットを行うもの。
    例えば、「123456789」と入力しフォーカス移動を行うと「123,456,789」と表示される。再入力するために再度フォーカスを あてると 「123456789」と表示される。
    Formatでは基本的に 入力文字 が 内部データに格納されます
  2. MaskFormatクラス
    since:Version.1.1.3
    決められたフォーマット形式の入力時に、入力補助的役割を行うもの
    例えば、郵便番号は 「123-4567」と [3桁数字 - 4桁数字] というフォーマットが決まっているので、 値未入力時の段階にて 「___-____」と表示して入力を行いやすいように設定するなどが行えます

    また、MaskFormatを使用するためには コンポーネントを DefaultFormattedTextField にする必要があります。
    指定されたフォーマット形式に合わない文字をプログラム内部から設定された場合には、設定文字はコンポーネント 上には表示されません。
    ("Mask指定に合わない文字列が設定された為、内部データが生成できませんでした。" などの エラーログが出力されます。)
    必ず、フォーマット形式に合う文字を設定するようにして下さい。
    補足補足
    表示文字列と内部データの形式を変えたい場合には 独自にフォーマットクラスを生成する必要があります。


 

2. 標準提供クラス

2-1. Format提供クラス

提供されているフォーマットクラスは以下の3種類です。

2-2. MaskFormat提供クラス

以下の提供クラスは MaskFormat用 クラスになります。使用時には、コンポーネントを DefaultFormattedTextField にして お使いください

提供されているフォーマットクラスは以下の3種類です。

 

3. 使用方法

Operation Management ConsoleのデータクラスもしくはData Management Consoleのデータ型にて設定を行います。
Operation Management ConsoleData Management Consoleと両方設定されている場合はData Management Consoleが優先されます。

  1. 表示変換クラスをダイアログより設定します
    標準提供クラス と 独自作成クラス の一覧が表示されます。
  2. 表示変換パターンの文字を入力します
    指定可能文字は 表示変換クラス の仕様に依存します。

    ./images/format.gif
  3. アイテムに、作成したデータ型を設定します。
 

4. 作成方法

表示変換クラスは、独自に作成可能です。

4-1. Formatクラス

作成するには jp.ne.mki.wedge.data.format.AbstractFormat を継承して作成します。
作成が必要なメソッドは以下の3つです。

以下は 表示変換クラス/Formatクラス を実装したサンプルです。

package jp.ne.mki.wedge.sample.client.formatter;

import java.text.DecimalFormat;
import java.text.ParseException;
import jp.ne.mki.wedge.data.format.AbstractFormat;

/**
 * Formatクラス サンプル 
 * 数値を指定されたパターンにてフォーマットします。
 * 
 * パターンの指定は java.text.DecimalFormat にて指定できる文字を指定 して下さい。
 * 
 * @see java.text.DecimalFormat
 * @author Media Knowledge Technologies Co.,Ltd.
 */

public class SampleDecimalFormat extends AbstractFormat {
    /** フォーマットパターン */
    private String pattern = "#,##0.###";

    /**
     * パターンの設定
     * @param String パターン
     */
    public void applyPattern(String pattern) {
        if (pattern != null) {
            this.pattern = pattern;
        }
    }

    /**
     * パターンの取得
     * @return String パターン
     */
    public String toPattern() {
        return pattern;
    }

    /**
     * 表示データの作成
     * @param Object 内部データに格納するObject
     * @return String テキスト上の文字列
     */
    public String valueToString(Object value) throws ParseException {
        if (value == null) {
            return "";
        }
        String targetValue = value.toString();
        if (targetValue.length() == 0) {
            return "";
        }

        DecimalFormat formatter = new DecimalFormat();
        formatter.applyPattern(pattern);
        try {
            return formatter.format(Double.parseDouble(targetValue));
        } catch (NumberFormatException ne) {
            //数値が入力されていなかったときには入力文字をそのまま表示する
            return targetValue;
        }
    }
}
	

データ型の情報など必要な場合には継承元の以下のメソッドより取得が可能です。

public String getId()
public String getLogicalName()
public String getPhysicalName()
public int getItemType()
public int getDataType()
public String getDefault()
public String[] getEnum()
public int getLength()
public int getScale()
public String getMaximum()
public String getMinimum()
public boolean isOmit()
public boolean isFix()

4-2. MaskFormatクラス

作成するには jp.ne.mki.wedge.run.client.component.text.formatter.DefaultMask を継承して作成します。
DefaultMaskは javax.swing.text.MaskFormatter を継承して作成されており、 valueToString、stringToValue のメソッドは javax.swing.text.MaskFormatter のメソッドを 実行しています。
そのため、指定パターンは このクラスにて使用出来る文字が指定可能になります。
(#:数字のみ、*:任意の文字 など)
詳しくは java APIリファレンス MaskFormatterを参照してください。
デフォルトの Placeholder(未入力表示)は _ (アンダーバー) が設定されています。
作成が必要なメソッドは以下の4つです。

以下は 表示変換クラス/MaskFormatクラス を実装したサンプルです。

package jp.ne.mki.wedge.sample.client.formatter;

import java.text.ParseException;
import java.util.regex.Pattern;
import jp.ne.mki.wedge.run.client.component.text.formatter.DefaultMask;

/**
 * MaskFormatterサンプル 
 * ****-****** の形式にてFormatを行います。
 * 
 * 内部データは ********** (ハイフンなし) にて格納し、 
 * 入力時、表示時には ****-******の形式にて表示します。
 * 
 * ____-123___ などのように、途中で入力された場合は 前詰めされます。 
 * (123_-______ と処理されます)
 * 
 * @see javax.swing.text.MaskFormatter
 * @author Media Knowledge Technologies Co.,Ltd.
 * @since webtribe/visualframe ver1.1.3
 *  
 */
public class SampleCodeMaskFormatter extends DefaultMask {
    /** フォーマットのパターン */
    private String FORMAT_PATTERN = "****-******";

    /** アンダーバーのパターン */
    static final Pattern PATTERN_UNDERBAR = Pattern.compile("_");

    /** 最初の桁数(4) */
    private static final int FIRST_LENGTH = 4;

    /**
     * パターン文字を設定 このメソッドにて設定はできません。常に ****-****** が設定されます。
     * @param パターン文字
     */
    public void applyPattern(final String pattern) {
        super.applyPattern(FORMAT_PATTERN);
    }

    /**
     * パターン文字を取得
     * @return パターン文字
     * @see jp.ne.mki.wedge.run.interfaces.DataFormatInterface#toPattern()
     */
    public final String toPattern() {
        return super.toPattern();
    }

    /**
     * 表示文字列を取得
     * 4桁目に -(ハイフン) を挿入し、未入力箇所に _ (アンダーバー) を追加します。
     * @param value 内部データ
     * @return 表示文字列
     * @throws ParseException 解析エラー
     */
    public String valueToString(final Object value) throws ParseException {
        if (value == null) {
            return super.valueToString(value);
        } else {
            String str = value.toString();
            if (str.length() > FIRST_LENGTH) {
                str = str.substring(0, FIRST_LENGTH) + "-"
                        + str.substring(FIRST_LENGTH, str.length());
            }

           //親クラスのvalueToStringをCallすることにより未入力箇所に
            //Placeholder(アンダーバー)文字を設定する。
            return super.valueToString(str);
        }
    }

    /**
     * 内部データ作成
     * -(ハイフン)、 _ (アンダーバー) を取り除きます
     * @param value 表示文字列
     * @return 内部データ
     * @throws ParseException 解析エラー
     */
    public Object stringToValue(final String value) throws ParseException {
        String str = null;
        try {
            if (value == null) {
                return "";
            } else {
                str = value.toString();
                //ハイフンを取り除く
                if (str.length() > FIRST_LENGTH) {
                    str = str.substring(0, FIRST_LENGTH)
                            + str.substring(FIRST_LENGTH + 1);
                }
                //アンダーバーを取り除く
                str = PATTERN_UNDERBAR.matcher(str).replaceAll("");
                return str;
            }
        } finally {
            str = null;
        }
    }
}

データ型の情報など必要な場合には継承元の以下のメソッドより取得が可能です。

public String getId()
public String getLogicalName()
public String getPhysicalName()
public int getItemType()
public int getDataType()
public String getDefault()
public String[] getEnum()
public int getLength()
public int getScale()
public String getMaximum()
public String getMinimum()
public boolean isOmit()
public boolean isFix()

また、継承元の javax.swing.text.MaskFormatter のメソッドである getFormattedTextField() にて対象の コンポーネントが取得可能です。