【问题标题】:Read-only binding and one-way converters using JGoodies binding使用 JGoodies 绑定的只读绑定和单向转换器
【发布时间】:2013-10-02 22:44:43
【问题描述】:

我正在尝试使用 JGoodies Binding 2.9.1 将 JTextFieldenabled 属性绑定到枚举属性。我希望这是一种单向操作:当属性更改时,我希望 JTextField 启用或禁用,但我不想采用另一种方式并根据 enabled 值设置枚举属性。

虽然我认为我已正确设置了所有内容,但我得到了 PropertyAccessException: Failed to set an modified 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

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

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

我哪里出错了?

【问题讨论】:

标签: java binding converter jgoodies


【解决方案1】:

我找到了解决方法。这很丑陋,但它有效。

我用BufferedValueModel 包裹我的ConverterValueModel,而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) {}
        }));

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2010-10-05
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多