Связывание только для чтения и односторонние преобразователи, использующие привязку JGoodies

Я пытаюсь использовать JGoodies Binding 2.9.1 для привязки enabled свойство JTextField в перечисление собственности. Я хочу, чтобы это была односторонняя операция: при изменении свойства я хочу JTextField чтобы включить или отключить, но я никогда не хочу идти другим путем и установить свойство enum на основе enabled значение.

Хотя я думаю, что все настроил правильно, я получаю исключение PropertyAccessException: не удалось установить адаптированное свойство Java Bean.

Моя модель - это стандартный 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"s sourceValue() метод вызывается, и потому что он вызывает UnsupportedOperationException Я получаю PropertyAccessException с привязки.

Я также попытался явно указать привязке не использовать установщик, но у меня все еще было то же поведение:

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

Куда я иду не так?

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) {}
        }));
Другие вопросы по тегам