2009年11月2日月曜日

JFormattedTextFieldの不具合?と対処

日付の入力や郵便番号の入力制御でJFormattedTextFieldを使っているが、おかしな挙動になる。
例えば日付をYY/MM/DD形式で入力したい場合でJFormattedTextFieldに"##/##/##"とマスクを設定すると

・日付と判定されない数値も入ってしまう
(09/12/32、09/13/01等)

・マスクに一致しない値を入れると前の数値に戻る
"09/11/01"と入力されている状態で、"09/01/  "
と入れフォーカスを外すと"09/11/01"に戻る。
空白にした場合も同様になる。


この状態では入力済みの日付をクリアする。といったケースに対応できないので、以下のような処理を実装し、ラッピングするようにした

■ FocusGain()時
if (jFormattedTextField1.getText().isEmpty() == true) {
    MaskFormatter maskFormatter =
        new MaskFormatter("##/##/##");
    DefaultFormatterFactory formatterFactory =
        new DefaultFormatterFactory(maskFormatter);

    jFormattedTextField1.setFormatterFactory(formatterFactory);

}

■ FocusLost()時
jFormattedTextField1.setFormatterFactory(null);
try {
    MaskFormatter maskFormatter =
        new MaskFormatter("##/##/##");
    maskFormatter.valueToString(jFormattedTextField1.getText());
   
} catch (java.text.ParseException ex) {
    jFormattedTextField1.setText("");
}

FocusGain()時にテキストが空であれば、setFormatterFactory()を行いマスクを有効に、
FocusList()時はFormatterFactoryを無効にして、MaskFormatterのvalueToString()によって書式の整合性をチェックしマッチしなければテキストを空にするという風にした

日付の妥当チェックについてはこの後に対応予定。

0 件のコメント: