Merlin の魔術

Swing の新たな JFormattedTextField コンポーネント

フォーマット・テキストを受け入れる入力フィールドを、最小限の労力で作成する方法

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Merlin の魔術

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Merlin の魔術

このシリーズの続きに乞うご期待。

Java 2 Standard Edition (J2SE) バージョン 1.4 は、利用可能な GUI エレメントのパレットに JSpinnerJFormattedTextField という新たな 2 つの Swing コンポーネントを追加します。最初の Merlin の魔術 のコラムでは、JSpinner コンポーネントについて説明しました。今回は、JFormattedTextField について取り上げます。

JFormattedTextField コンポーネントは JTextField のように見えますが、まったく異なる役割を果たします。最も簡単なケースでは、電話番号の「(###) ###-####」のような入力マスクを指定することができますが、そのフォーマットに従わない入力は一切受け入れられません。より複雑なケースでは、表示フォーマッターと入力フォーマッターの両方があります。たとえばデフォルトの日付フォーマッターは、編集中にカーソルの位置に基づいて選択可能な月や日をスクロールすることができます。

JFormattedTextField を使用する場合、受け入れ可能な入力は、マスクによって明示的に指定されるか、またはコンポーネントの値によって指定されます。後者の場合、コンポーネントは Factory デザイン・パターンを使用して、指定された値のクラスに対するデフォルトのフォーマッターを検索します。DefaultFormatterFactory コンポーネントには、プリインストールされた日付、数値、java.text.Format サブクラス用のフォーマッターと、その他のすべてに対応するキャッチオール・フォーマッターが付属しています。

ではコンポーネントの使用方法について見ていきましょう。

受け入れ可能な入力の設定

マスクされた入力の構成は、通常は MaskFormatter クラスのインスタンスを使用して設定されます。javax.swing.text パッケージの中でわかるように、MaskFormatter は一連の文字を使用して、受け入れ可能な入力を指定します。8 つの各文字は、以下のように入力の 1 文字を表します。

#数値
?文字
A文字または数値
*あらゆるもの
U大文字にマップされた小文字を持つ文字
L小文字にマップされた大文字を持つ文字
H16 進数字 (A-F、a-f、0-9)
'別のマスク文字のエスケープに使用

MaskFormatter の他に、java.text パッケージの DateFormat クラスや NumberFormat クラスを使用して、入力フォーマットを指定することもできます。リスト 1 は、いくつかの可能なフォーマットを示しています。

リスト 1. 入力マスクの定義
// Four-digit year, followed by month name and day of month,
// each separated by two dashes (--)
DateFormat format = new SimpleDateFormat("yyyy--MMMM--dd");
DateFormatter df = new DateFormatter(format);
// US Social Security number
MaskFormatter mf1 = new MaskFormatter("###-##-####");
// US telephone number
MaskFormatter mf2 = new MaskFormatter("(###) ###-####");

入力フォーマットを指定した後は、以下に示すようにフォーマッターを JFormattedTextField コンストラクターに渡します。

JFormattedTextField ftf1 = new JFormattedTextField(df);

使用するフォーマッターによっては、他のオプションを設定することができます。たとえば MaskFormatter の場合、setPlaceholderCharacter(char) によってプレースホルダー文字を設定することができます。また日付フィールドに関しては、フィールドをある値に初期化すれば、ユーザーは、どの入力フォーマットが受け入れ可能かを知る助けになります。

まとめ

マスクされた入力フィールドの作成に関する説明は、これですべてです。リスト 2 は、前述のコードの断片を組み合わせて新たな機能を試した完全な例です。図 1 はその画面を示しています。気軽に個々のマスクを調整して、他のマスク文字を試してみてください。

図 1. 実行中の JFormattedTextField
実行中の JFormattedTextField
実行中の JFormattedTextField
リスト 2. JFormattedTextField の例
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.util.*;
import java.text.*;
public class FormattedSample {
  public static void main (String args[]) throws ParseException {
    JFrame f = new JFrame("JFormattedTextField Sample");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = f.getContentPane();
    content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));
    // Four-digit year, followed by month name and day of month,
    // each separated by two dashes (--)
    DateFormat format = new SimpleDateFormat("yyyy--MMMM--dd");
    DateFormatter df = new DateFormatter(format);
    JFormattedTextField ftf1 = new JFormattedTextField(df);
    ftf1.setValue(new Date());
    content.add(ftf1);
    // US Social Security number
    MaskFormatter mf1 = new MaskFormatter("###-##-####");
    mf1.setPlaceholderCharacter('_');
    JFormattedTextField ftf2 = new JFormattedTextField(mf1);
    content.add(ftf2);
    // US telephone number
    MaskFormatter mf2 = new MaskFormatter("(###) ###-####");
    JFormattedTextField ftf3 = new JFormattedTextField(mf2);
    content.add(ftf3);
    f.setSize(300, 100);
    f.show();
  }
}

ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology
ArticleID=218827
ArticleTitle=Merlin の魔術: Swing の新たな JFormattedTextField コンポーネント
publish-date=06012002