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



我正在使用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 );
    }
}

这是我的主要方法,其中配置了元部件:

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),则对象 被检查者必须提供财产变更支持。如果设置为 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 对象始终保持原始值。

提前谢谢。

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

此处报告了此问题。

很抱歉对 BeansBinding 的"流氓"版本感到困惑。我已经更新了 Metawidget 文档,以节省将来其他人的挫败感。

最新更新