enabled
JGoodies 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)));
驚いたことに、EnumMatchToEnabledConverter
のsourceValue()
メソッドが呼び出され、 が発生するため、バインディングから がUnsupportedOperationException
取得されます。PropertyAccessException
セッターを使用しないようにバインディングに明示的に指示しようとしましたが、それでも同じ動作が得られました。
Bindings.bind(
myTextField, "enabled", new ConverterValueModel(
pm.getModel(MyModel.MY_PROPERTY, "getMyProperty", null), // null setter!
new EnumMatchToEnabledConverter(MyEnum.MyValue)));
どこが間違っていますか?