1

enabledJGoodies Binding 2.9.1 を使用して、のプロパティをJTextField列挙型プロパティにバインドしようとしています。これを一方向の操作にしたい: プロパティが変更されたらJTextField、有効または無効にしたいが、逆に値に基づいて enum プロパティを設定したくないenabled.

すべてを適切に設定したと思いますが、PropertyAccessException: Failed to set an adapted Java Bean property が発生しています

私のモデルは、プロパティ変更イベントを持つ標準の Java Bean です。

public static String MY_PROPERTY = "myProperty";
private MyEnum myProperty;

public MyEnum getMyProperty() { return myProperty; }

public void setMyProperty(final MyEnum newValue) {
    final MyEnum oldValue = myProperty;
    if (newValue == oldValue) { return; }
    myProperty = newValue;
    changeSupport.firePropertyChange(MY_PROPERTY, oldValue, newValue);
}

私の見解では、バインドされた値が提供された値と一致する場合に true を返す一方向のコンバーターがあります。

private final class EnumMatchToEnabledConverter implements BindingConverter<MyEnum, Boolean> {
    private MyEnum match;

    public EnumMatchToEnabledConverter (MyEnum match) {
        this.match = match;
    }

    @Override
    public Boolean targetValue(MyEnum source) {
        return (source == match);
    }

    @Override
    public MyEnum sourceValue(Boolean target) {
        // this wouldn't make sense
        throw new UnsupportedOperationException();
    }
}

次に、バインディングをセットアップします。

PresentationModel<MyModel> pm = new PresentationModel<MyModel>(model);
Bindings.bind(
    myTextField, "enabled", new ConverterValueModel(
        pm.getModel(MyModel.MY_PROPERTY),
        new EnumMatchToEnabledConverter(MyEnum.MyValue)));

驚いたことに、EnumMatchToEnabledConvertersourceValue()メソッドが呼び出され、 が発生するため、バインディングから がUnsupportedOperationException取得されます。PropertyAccessException

セッターを使用しないようにバインディングに明示的に指示しようとしましたが、それでも同じ動作が得られました。

Bindings.bind(
    myTextField, "enabled", new ConverterValueModel(
        pm.getModel(MyModel.MY_PROPERTY, "getMyProperty", null), // null setter!
        new EnumMatchToEnabledConverter(MyEnum.MyValue)));

どこが間違っていますか?

4

1 に答える 1

1

回避策を見つけました。醜いですが、うまくいきます。

トリガーがトリガーされないでラップConverterValueModelします。BufferedValueModelValueModel

Bindings.bind(
    myTextField,
    "enabled",
    new BufferedValueModel(
        new ConverterValueModel(
            pm.getModel(MyModel.MY_PROPERTY),
            new EnumMatchToEnabledConverter(MyEnum.MyValue)),
        new AbstractValueModel() {
            @Override public Object getValue() { return null; }
            @Override public void setValue(Object o) {}
        }));
于 2013-09-26T20:37:36.657 に答える