GWT, Enum, RadioButton и Editors framework

Вот проблема: у меня есть бин, и у этого бина есть свойство enum:

enum E {
    ONE, TWO, THREE;
}

class A implements Serializable {
    public E foo;
}

Я хотел бы использовать среду GWT Editor, чтобы позволить пользователю редактировать этот компонент

public class P extends FlowPanel implements Editor<A> {
    // ... UiBinder code here ...
    @UiField RadioButton one, two, three;
    // ...
}

У меня есть ошибка:

[ОШИБКА] [gwtmodule] - Не удалось найти геттер для пути один в прокси-типе com.company.A

[ОШИБКА] [gwtmodule] - Не удалось найти получатель для пути два в типе прокси com.company.A

[ОШИБКА] [gwtmodule] - Не удалось найти геттер для пути три в типе прокси com.company.A

Есть ли способ заставить это работать в GWT 2.2?

2 ответа

Решение
public class EnumEditor extends FlowPanel implements LeafValueEditor<E> {

    private Map<RadioButton, E> map;

    @UiConstructor
    public EnumEditor(String groupName) {
        map = new HashMap<RadioButton, E>();
        for (E e: E.class.getEnumConstants()){
            RadioButton rb = new RadioButton(groupName, e.name());
            map.put(rb, e);
            super.add(rb);
        }
    }

    @Override
    public void setValue(E value) {
        if (value==null)
            return;
        RadioButton rb = (RadioButton) super.getWidget(value.ordinal());
        rb.setValue(true);
    }

    @Override
    public E getValue() {
        for (Entry<RadioButton, E> e: map.entrySet()) {
            if (e.getKey().getValue())
                return e.getValue();
        }
        return null;
    }
}

Проблема не в перечислении. Компилятор ищет bean-подобные методы получения, которые соответствуют uiFields 1, 2 и 3. Радиокнопки отображают на логические свойства, поскольку они реализуют IsEditor<LeafValueEditor<java.lang.Boolean>> интерфейс.

Это должно заставить ваш пример кода работать, но это, очевидно, не очень гибкое решение:

class A implements Serializable {
    public E foo;
    public Boolean getOne() {return foo==E.ONE;}
    public Boolean getTwo() {return foo==E.TWO;}
    public Boolean getThree() {return foo==E.THREE;}
}

Чтобы сопоставить группу радиокнопок с одним свойством enum (и соответствующим геттером / сеттером), вам необходимо реализовать собственный редактор, заключающий в себе группу радиокнопок и возвращающий значение типа E. Для этого потребуется реализовать интерфейс, подобный IsEditor<LeafValueEditor<E>>,

Есть связанное обсуждение о группе GWT

Другие вопросы по тегам