Связывание только для чтения и односторонние преобразователи, использующие привязку 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) {}
}));