S2Swing的なもの開発記: バリューバインディング
以下のように、アノテーションを付けたモデル側のフィールド値と、ビュー側のUIコンポーネント値を自動バインディングするようにしました。
- モデル側
public class EmployeeModel { @ReadWrite @NotBlank private String name; @ReadWrite @Required @Converter(type = DateTimeConverter.class, args = {"yyyy-MM-dd"}) private Date birthDate; @ReadWriteSelection private String department; @Read(target = "department") private String[] departmentItems; // getters and setters }
- ビュー側
public EditView extends JFrame { private JTextField name; private JTextField birthDate; private JComboBox department; @Model private EmployeeModel employeeModel; // ... }
ビューに@Modelアノテーションを付けたフィールドを置くと、それがバインディング対象になります。このとき、モデルがS2AOPによってエンハンスされ、addPropertyChangeListener()が付加されるので、Beans Bindingの監視対象としても機能し、モデル側のプロパティ変更が直ちにUIに反映されるようになります。
コンバータとバリデーション制約の指定も、上の例のようにアノテーションで行います。バリデーションの機構はOValを参考にして作っています。今は、コンバータやバリデータのエラーハンドリング処理をユーザが簡単に付加できる仕組みについて試行錯誤しているところです。