使用JGoodies绑定的只读绑定和单向转换器

时间:2013-09-26 19:36:59

标签: java binding converter jgoodies

我试图使用JGoodies Binding 2.9.1将enabled的{​​{1}}属性绑定到枚举属性。我希望这是一个单向操作:当属性发生变化时,我希望JTextField被启用或禁用,但我不想再采取其他方式并根据{{1设置enum属性价值。

虽然我认为我正确设置了所有内容,但我收到了一个 PropertyAccessException:无法设置适应的Java Bean属性

我的模型是具有属性更改事件的标准Java Bean:

JTextField

在我看来,我有一个单向转换器,当绑定值与提供的值匹配时,它将返回true:

enabled

然后我设置了绑定:

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);
}

令我惊讶的是,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(); } } 的{​​{1}}方法被调用,因为它引发PresentationModel<MyModel> pm = new PresentationModel<MyModel>(model); Bindings.bind( myTextField, "enabled", new ConverterValueModel( pm.getModel(MyModel.MY_PROPERTY), new EnumMatchToEnabledConverter(MyEnum.MyValue))); 我从绑定中获得EnumMatchToEnabledConverter

我也尝试明确告诉绑定不要使用setter,但我仍然有相同的行为:

sourceValue()

我哪里错了?

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。这很难看,但它确实有效。

我将ConverterValueModelBufferedValueModel触发器永远不会触发的ValueModel打包在一起。

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) {}
        }));