このページの内容に対応するソースコードは、s2swing-tutorialアーカイブのvalidationパッケージ以下にあります。
S2Swingには、@Requiredや@Lengthといった制約アノテーションが用意されています。 モデルクラスのプロパティにこれらのアノテーションを付加することで、アプリケーションにバリデーション機構を簡単に組み込むことができます。
S2Swingでは、基本的に次のような流れでバリデーションを記述します。
上記の流れを具体的に見ていきましょう。ここでは、テキストフィールドに4文字以上のユーザ名を入力させる場面を考えてみます。 まず、ユーザ情報を示すUserクラスを作成します。ユーザ名を示すnameプロパティに、@Lengthアノテーションを使って制約を指定します。
package validation; import java.io.Serializable; import org.seasar.swing.validator.annotation.Length; public class User implements Serializable { private static final long serialVersionUID = 1L; @Length(min = 4) private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
@Length(min = 4)として、nameプロパティが4文字以上でなければならないことを指示しています。 なお、アノテーションの位置は、フィールド、getter、setterのいずれでも認識されます。
次に、ユーザ名の入力画面となるValidationUsageFrameクラスを作りましょう。
package validation; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.JTextField; import org.seasar.swing.beans.ObservableBeans; import org.seasar.swing.binding.Binder; import org.seasar.swing.binding.BindingStateEvent; import org.seasar.swing.binding.BindingStateListener; import org.seasar.swing.component.S2Frame; public class ValidationUsageFrame extends S2Frame { private static final long serialVersionUID = 1L; private JTextField textField = new JTextField(); private User user; public void initialize() { setDefaultCloseOperation(EXIT_ON_CLOSE); textField.setPreferredSize(new Dimension(360, 24)); Container c = getContentPane(); c.setLayout(new FlowLayout()); c.add(textField); user = ObservableBeans.create(User.class); Binder binder = new Binder(); binder.add(user, "name", textField, "text"); binder.addBindingStateListener(new BindingStateListener() { public void bindingStateChanged(BindingStateEvent e) { setTitle(e.getSimpleErrorMessage()); } }); binder.bind(); } }
このコードのように、バリデーションは通常、バインディングとセットで行われます。
バインディングのターゲットオブジェクト(ここではtextFieldコンポーネント)のプロパティが変更されると、ただちにバリデーションが行われます。 バリデーションが成功すれば、ターゲット値がソースプロパティ(ここではuser.name)に代入されます。バリデーションが失敗した場合、ソースプロパティは変更されません。 このバリデーションの結果は、BindingStateEvent型のイベントとしてリスナーへ通知されます。
34行目では、Binder#addBindingStateListener()を呼び出して、BindingStateEventのイベントハンドラを記述しています。 ハンドラの内容は、エラーメッセージをフレームのタイトルに設定するという単純なものです。
それでは、アプリケーションを実行してみましょう。初期状態で、フレームのタイトルが「name : 入力は4文字以上でなければいけません。」となっていますね。
テキストフィールドに文字を入力して、フレームタイトルがどう変化するか観察してみてください。 入力が4文字以上に達したとき、エラーメッセージが消えることが確認できます。