使用Metawidget将对象与GUI中的值同步

时间:2012-05-29 01:56:20

标签: java javabeans beans-binding

我正在使用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 对象始终保持原始值。

提前致谢。

2 个答案:

答案 0 :(得分:2)

好吧,我解决了这个问题。互联网上有一个“流氓”版本的beansbinding.jar,这就是为什么绑定不起作用的原因。我使用随Metawidget示例分发的版本,现在一切正常。

报告此问题here

答案 1 :(得分:1)

对于关于'流氓'版BeansBinding的混淆感到抱歉。我已经更新了Metawidget文档,以便将来为其他人节省挫折感。