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>>
,