GWT Editor Framework — показать ENUM с помощью ValueListBox в собственном редакторе

У меня есть перечисление 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() везде, где я хочу его использовать.


person slugmandrew    schedule 25.03.2014    source источник


Ответы (2)


Используйте 1_:

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 иерархию. И вам не нужны методы get/set в вашем перечислении SupplierCode.

person spg    schedule 25.03.2014
comment
Вы можете напрямую initWidget(this.codes); и пропустить UiBinder, если вам не нужно настраивать макет списка по умолчанию. - person djjeck; 30.07.2014

Вы должны либо:

  • используйте @Editor.Path("") на своем ребенке ValueListBox

  • заставьте свой SupplierCodeEditor реализовать LeafValueEditor<SupplierCode>, делегировав getValue и setValue ValueListBox

  • заставить свой SupplierCodeEditor реализовать IsEditor<LeafValueEditor<SupplierCode>, вернув asEditor() ValueListBox из собственного asEditor().

Кстати, вам абсолютно не нужны getValue и setValue в ваших значениях перечисления.

person Thomas Broyer    schedule 25.03.2014
comment
Настройка @Path("") не сработала, но реализация LeafValueEditor<SupplierCode> помогла. Спасибо! - person slugmandrew; 25.03.2014