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

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

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

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

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

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

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

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

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


person Andrei Vajna II    schedule 10.05.2011    source источник


Ответы (1)


Похоже, мне просто нужно было поближе познакомиться с 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 к изображению.

person Andrei Vajna II    schedule 11.05.2011