GWT 2.1 UiBinder SimplePager требует атрибута местоположения

Что может быть предоставлено атрибуту местоположения

<c:SimplePager ui:field='pager' location='HERE' /> 

Я попробовал CENTER, но это не сработало, я вижу в примере приложения расходов, что у них нет атрибута местоположения, а вместо этого он устанавливается при его создании в UiBinder. Но я не могу этого сделать, так как это обязательный атрибут. Что делать?


person rapadura    schedule 17.11.2010    source источник
comment
У меня нет проблем с этим, ‹c:SimplePager ui:field='pager' location='CENTER' /› запускается   -  person Jerome Cance    schedule 24.11.2010


Ответы (3)


Вы должны предоставить SimplePager.TextLocation, который может быть ЦЕНТР, ВЛЕВО или ВПРАВО.

<c:SimplePager ui:field='pager' location='CENTER'/>
person Peter Knego    schedule 23.11.2010
comment
Если я сделаю это так и попытаюсь получить другую ошибку, я увижу, когда получу доступ к ноутбуку с моим проектом, что это такое. - person rapadura; 28.11.2010
comment
Я получил эту ошибку, если добавил атрибут местоположения: [ОШИБКА] Класс SimplePager не имеет подходящего метода setLocation() Элемент ‹c:SimplePager location='CENTER' ui:field='pager'› (:12) - person tbruyelle; 30.10.2011
comment
Может быть из-за порядка элементов. Немного запоздалый ответ, но может сэкономить кому-то время. ui: поле должно быть перед местоположением, я думаю. - person Johan S; 29.06.2012

Единственное решение, которое я вижу на данный момент, это работа с @UiField(provided = true). Не уверен, что это поможет, но в любом случае посмотрите небольшой пример ниже.

Пользовательский интерфейс.xml:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:c="urn:import:com.google.gwt.user.cellview.client">
    <ui:style>

    </ui:style>
    <g:HTMLPanel>
        <c:CellList ui:field="list" />
        <c:SimplePager ui:field="pager" />
        <g:Button ui:field="more" text="addMore" />
    </g:HTMLPanel>
</ui:UiBinder>

и виджет:

public class TestView extends Composite {

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

    interface TestViewUiBinder extends UiBinder<Widget, TestView> {}

    @UiField(provided = true)
    CellList<String> list;
    @UiField(provided = true)
    SimplePager pager;
    @UiField
    Button more;
    private int counter = 0;
    private ListDataProvider<String> provider;

    public TestView() {
        list = new CellList<String>(new TextCell());
        pager = new SimplePager();
        initWidget(uiBinder.createAndBindUi(this));
        provider = new ListDataProvider<String>(getList());
        provider.addDataDisplay(list);
        pager.setDisplay(list);
        pager.setPageSize(5);
    }

    private LinkedList<String> getList() {
        LinkedList<String> list = new LinkedList<String>();
        list.add("1st");
        list.add("2nd");
        list.add("3rd");
        list.add("4th");
        list.add("5th");
        return list;
    }

    @UiHandler("more")
    void onMoreClick(ClickEvent event) {
        provider.getList().add(++counter + " more");
    }
}
person z00bs    schedule 23.11.2010
comment
Да, я тоже сделал это так, что не является элегантным решением, и все же моя IDE (Intelij) говорит, что в SimplePager есть обязательное поле, но, как ни странно, оно компилируется и работает без проблем. Мне кажется странным, что вы можете сделать pager = new SimplePager(); ‹-- не вызывая конструктор, который указывает TextLocation или устанавливая его, но тег пользовательского интерфейса SimplePager терпит неудачу. Это должно быть ошибка, не так ли, z00bs? - person rapadura; 28.11.2010

UiBinder не может создать экземпляр класса SimplePager, так как у него нет установщика Location для исправления ошибки.

Альтернативой @UiField(provided=true), которая позволяет автоматически создавать экземпляры переменных, является создание фабричного метода для указания странице за пределами UiBinder о том, как создавать экземпляры и при необходимости настраивать объект.

Вот пример фабричного метода, который будет применяться к любому классу @UiField SimplePager. @UiField(provided=true) будет обрабатывать несколько различных экземпляров, но для одного UiFactory является самым простым, потому что вам не нужно беспокоиться о том, когда используется переменная.

@UiFactory SimplePager createSimplePager() {
    return new SimplePager(TextLocation.CENTER);
}
person Timothy Gonzalez    schedule 01.05.2014