2

这是问题所在:我有一个 bean,这个 bean 有一个 enum 属性:

enum E {
    ONE, TWO, THREE;
}

class A implements Serializable {
    public E foo;
}

我想使用GWT Editor 框架让用户编辑这个 bean

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 中完成这项工作?

4

2 回答 2

8
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;
    }
}
于 2011-02-13T21:39:06.590 回答
1

问题不在于枚举。编译器正在寻找对应于 uiFields 1、2 和 3 的类 bean 的 getter 方法。IsEditor<LeafValueEditor<java.lang.Boolean>>RadioButtons 在实现接口时映射到布尔属性。

这应该使您的示例代码工作,但它显然不是一个非常灵活的解决方案:

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;}
}

要将一组单选按钮映射到单个枚举属性(及其相应的 getter/setter),您必须实现自己的编辑器来包装单选按钮组,并返回 E 类型的值。它需要实现类似的接口IsEditor<LeafValueEditor<E>>.

GWT group上有一个相关的讨论

于 2011-02-13T16:24:07.977 回答