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を提供しようとしました(これを参照していると思います)。これは、次のコードを追加するのと同じです。

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 に答える