GWT编辑器框架 - 在自己的编辑器中使用ValueListBox显示ENUM

时间:2014-03-25 13:11:56

标签: java gwt enums gwt-editors

我有一个枚举SupplierCode

public enum SupplierCode
{       
    BG("British Gas"), CNG("Contract Natural Gas"), COR("Corona Energy");

    private String value;

    SupplierCode(String value)
    {
        if(value != "")
        {
            this.value = value;
        }
    }

    // ... toString() and fromString() omitted for brevity

    // for editor framework (?)
    public String getValue()
    {
        return value;
    }
    public void setValue(String value)
    {
        this.value = value;
    }
}

我使用ValueListBox

在我的编辑器中显示它
@UiField(provided = true)
ValueListBox<SupplierCode> supplierCode = new ValueListBox<SupplierCode>(new AbstractRenderer<SupplierCode>()
{
    @Override
    public String render(SupplierCode object)
    {
        return object == null ? "" : object.toString();
    }
});

// in the constructor
public ContractEditor()
{
    initWidget(uiBinder.createAndBindUi(this));
    supplierCode.setAcceptableValues(Arrays.asList(SupplierCode.values()));
}

我必须在我的应用中多次编辑此类型,因此我想为此下拉列表创建一个名为SupplierCodeEditor的编辑器:

public class SupplierCodeEditor extends Composite implements Editor<SupplierCode>
{
    private static SupplierCodeEditorUiBinder uiBinder = GWT.create(SupplierCodeEditorUiBinder.class);

    interface SupplierCodeEditorUiBinder extends UiBinder<Widget, SupplierCodeEditor>
    {
    }

    @UiField(provided = true)
    ValueListBox<SupplierCode> value = new ValueListBox<SupplierCode>(new AbstractRenderer<SupplierCode>()
    {
        @Override
        public String render(SupplierCode object)
        {
            return object == null ? "" : object.toString();
        }
    });

    public SupplierCodeEditor()
    {
        initWidget(uiBinder.createAndBindUi(this));
        value.setAcceptableValues(Arrays.asList(SupplierCode.values()));
    }

}

但是,当我使用它时,虽然它使用选项呈现列表,但它不会从列表中选择实际值。我认为getValue()和setValue()方法可以工作,但似乎没有。

有没有人知道如何将它放在一个编辑器文件中?那么我不必重复渲染器的代码并在每个我想使用它的地方调用setAcceptableValues()。

2 个答案:

答案 0 :(得分:2)

使用LeafValueEditor<SupplierCode>

public class SupplierEditor extends Composite implements LeafValueEditor<SupplierCode> {
    interface SupplierEditorUiBinder extends UiBinder<Widget, SupplierEditor> {
    }

    private static SupplierEditorUiBinder uiBinder = GWT.create(SupplierEditorUiBinder.class);

    @UiField(provided = true)
    ValueListBox<SupplierCode> codes;

    public SupplierEditor() {
        codes = new ValueListBox<>(new AbstractRenderer<SupplierCode>() {
            @Override
            public String render(SupplierCode object) {
                return object == null ? "" : object.toString();
            }
        });

        initWidget(uiBinder.createAndBindUi(this));

        codes.setAcceptableValues(Arrays.asList(SupplierCode.values()));
    }

    @Override
    public SupplierCode getValue() {
        return codes.getValue();
    }

    @Override
    public void setValue(SupplierCode value) {
        codes.setValue(value);
    }
}

这样,您的窗口小部件可以轻松插入Editor层次结构中。 并且您不需要SupplierCode枚举中的get / set方法。

答案 1 :(得分:1)

您必须:

  • 对您的孩子使用@Editor.Path("") ValueListBox

  • 制作SupplierCodeEditor工具LeafValueEditor<SupplierCode>,将getValuesetValue委托给ValueListBox

  • 制作SupplierCodeEditor工具IsEditor<LeafValueEditor<SupplierCode&gt;,从您自己的ValueListBox返回asEditor() asEditor()

顺便说一下,你绝对不需要你的枚举值getValuesetValue