Как я могу связать свойство (например, Enum) со свойством компонента другого типа (например, изображение для каждого Enum)? - PullRequest
2 голосов
/ 10 мая 2011

Я унаследовал проект, который использует JGoodies Binding для подключения модели домена к графическому интерфейсу.Однако я обнаружил некоторые несоответствия, которые также вызывают некоторые ошибки.

В данном конкретном случае графический интерфейс пользователя представлен двумя переключателями и меткой.В зависимости от того, какая кнопка выбрана, на этикетке должно отображаться определенное изображение.Кнопки привязаны к различным значениям Enum, например:

AbstractValueModel enumSelectionModel = presentationModel.getModel("selection");

radioBtn1 = BasicComponentFactory.createRadioButton(enumSelectionModel,
        Selection.selection1, "");

radioBtn2 = BasicComponentFactory.createRadioButton(enumSelectionModel,
        Selection.selection2, "");

"selection" - это свойство bound, а Selection - Enum, что означает, что при изменении другой кнопки, selection для свойства в моей модели задано соответствующее значение Enum.

Мой вопрос: Как связать это свойство с изображением, отображаемым надписью?

Отчто я видел, JGoodies отлично подходит для привязки таких вещей, как строки к текстовым полям, но в этом случае также должно быть преобразование, некоторая логика, которая решает сопоставить свойство enum с изображением.

1 Ответ

3 голосов
/ 11 мая 2011

Похоже, мне просто нужно было поближе познакомиться с Binding API. AbstractConverter - это именно то, что я искал.

Bindings.bind((JComponent) pictureLabel, "icon", new EnumToIconConverter(enumSelectionModel));

Метод bind связывает значок pictureLabel с моделью, описанной конвертером. Конвертер выглядит так:

class EnumToIconConverter extends AbstractConverter {

    EnumToIconConverter(ValueModel subject) {
        super(subject);
    }

    @Override
    public Object convertFromSubject(Object enum) {
        return enum == Selection.selection1 ? image1 : image2;
    }

    @Override
    public void setValue(Object obj) {
        throw new UnsupportedOperationException("setValue makes no sense for this converter");
    }
}

В методе convertFromSubject выполняется преобразование из Enum в изображение. Я не реализовал setValue, потому что в этом случае это не имеет смысла. Изображение не может изменяться само по себе, я хочу, чтобы обновления проходили только одним способом - от свойства enum к изображению.

...