我试图使用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()
我哪里错了?
答案 0 :(得分:1)
我找到了解决方法。这很难看,但它确实有效。
我将ConverterValueModel
与BufferedValueModel
触发器永远不会触发的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) {}
}));