我正在使用Metawidget自动查看/编辑GUI中对象的值。我能够绑定对象的初始值,并在各自的GUI组件中查看它们。但是,当我更改GUI中的值时,这些更改不会同步回对象。这或多或少记录在案here(已弃用)和here。
这是我的业务对象:
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
...
}
在documentation中有人说:
如果设置为READ或READ_WRITE(默认为READ_ONCE),则为对象 被检查必须提供PropertyChangeSupport。如果设置为 READ_WRITE,UI的更新会自动同步回 setToInspect,否则客户端必须手动调用save:
myMetawidget.getWidgetProcessor(BeansBindingProcessor.class).save(myMetawidget)
我已尝试将 UpdateStrategy 设置为READ和/或READ_WRITE,和/或在 BeansBindingProcessor 上调用save()。我还尝试将 PropertyChangeSupport 提供给 Person 对象(我认为它引用了this),这与添加以下代码相同:< / p>
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 对象始终保持原始值。
提前致谢。
答案 0 :(得分:2)
好吧,我解决了这个问题。互联网上有一个“流氓”版本的beansbinding.jar,这就是为什么绑定不起作用的原因。我使用随Metawidget示例分发的版本,现在一切正常。
报告此问题here。
答案 1 :(得分:1)
对于关于'流氓'版BeansBinding的混淆感到抱歉。我已经更新了Metawidget文档,以便将来为其他人节省挫折感。