1

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

提前致谢。

4

2 回答 2

2

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

此处报告了此问题。

于 2012-05-29T18:52:07.793 回答
1

对于 BeansBinding 的“流氓”版本的混淆,我们深表歉意。我已经更新了 Metawidget 文档,以便在将来避免其他人的挫败感。

于 2012-06-05T00:22:02.190 回答