Metawidgetを使用して、GUIのオブジェクトの値を自動的に表示/編集しています。オブジェクトの初期値をバインドして、それぞれのGUIコンポーネントで確認することができます。ただし、GUIで値を変更すると、これらの変更はオブジェクトに同期されません。これは多かれ少なかれここ(非推奨)とここに文書化されています。
これが私のビジネスオブジェクトです。
public static class Person {
private String mName;
public String getName() { return this.mName; }
public void setName( String name ) { this.mName = name; }
@UiAction
public void showPersonObject() {
JOptionPane.showMessageDialog(frame, this.mName);
}
@UiAction
public void bind() {
metawidget.getWidgetProcessor(
BeansBindingProcessor.class)
.save( metawidget );
}
}
これが私の主な方法で、metawidgetが構成されています。
public static void main( String[] args ) {
// Person
Person person = new Person();
person.setName("A cool name");
// Metawidget
metawidget = new SwingMetawidget();
metawidget.setInspector( new CompositeInspector(
new CompositeInspectorConfig().setInspectors(
new PropertyTypeInspector(),
new MetawidgetAnnotationInspector(),
new BeanValidationInspector())));
metawidget.addWidgetProcessor(
new BeansBindingProcessor(
new BeansBindingProcessorConfig().setUpdateStrategy(
UpdateStrategy.READ_WRITE )) );
metawidget.setToInspect( person );
// Create Frame
...
}
ドキュメントでは、次のように述べられています。
READまたはREAD_WRITE(デフォルトはREAD_ONCE)に設定されている場合、検査されるオブジェクトはPropertyChangeSupportを提供する必要があります。READ_WRITEに設定されている場合、UIの更新は自動的にsetToInspectに同期されます。そうでない場合、クライアントは手動でsaveを呼び出す必要があります。
myMetawidget.getWidgetProcessor(BeansBindingProcessor.class).save(myMetawidget)
UpdateStrategyをREADおよび/またはREAD_WRITEに設定するか、 BeansBindingProcessorでsave()を呼び出してみました。また、PersonオブジェクトにPropertyChangeSupportを提供しようとしました(これを参照していると思います)。これは、次のコードを追加するのと同じです。
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
this.pcs.removePropertyChangeListener(listener);
}
public void setName( String name ) {
String oldName = this.mName;
this.mName = name;
this.pcs.firePropertyChange("name", oldName, mName);
}
ただし、Personオブジェクトは常に元の値を維持します。
前もって感謝します。