我正在使用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 (我认为它指的是this),这与添加以下代码相同:
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对象始终保持原始值。
提前致谢。