GWT 2.1 UiBinder SimplePager 需要 location 属性。

15

一个 `location` 属性可以提供什么信息?

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

我尝试了CENTER,但它没起作用。在一个范例应用程序中,我看到他们没有使用location属性,而是在UiBinder的创建中设置了它。但由于这是必需属性,所以我不能这样做。该怎么办?


我对此没有任何问题,<c:SimplePager ui:field='pager' location='CENTER' /> 运行正常。 - Jerome Cance
3个回答

24

您必须提供 SimplePager.TextLocation,它可以是CENTER、LEFT或RIGHT。

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

如果我这样做,而且我已经尝试过了,我会得到另一个错误,等我能够访问我的项目所在的笔记本电脑时,我会看到具体是什么错误。 - rapadura
如果我添加location属性,就会出现以下错误:[ERROR] Class SimplePager has no appropriate setLocation() method Element <c:SimplePager location='CENTER' ui:field='pager'> (:12) - tbruyelle
可能是元素的顺序导致的。回复有点晚,但可以为某人节省一些时间。我认为ui:field应该在location之前。 - Johan S

5

我目前看到的唯一解决方案是使用@UiField(provided = true)。不确定这是否有帮助,但无论如何请查看以下小例子。

ui.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");
    }
}

1
是的,我也是这样做的,这不是一个优雅的解决方案,我的IDE(Intelij)仍然显示SimplePager上有一个必填字段,但奇怪的是它可以编译和运行而没有问题。我认为很奇怪,你可以这样做pager = new SimplePager(); <-- 不调用指定TextLocation的构造函数或设置它,但是SimplePager ui标签会失败。这一定是个错误,不是吗,z00bs? - rapadura

1
SimplePager类不能被UiBinder实例化,因为它没有Location的setter方法来修复错误。
@UiField(provided=true)的替代方法是创建一个工厂方法,在UiBinder之外指示页面如何实例化并设置对象(如果需要)以自动实例化变量。
以下是一个工厂方法的示例,它将应用于任何@UiField SimplePager类。 @UiField(provided=true)将处理多个不同的实例化,但对于一个简单的UiFactory是最简单的,因为您不必关心变量何时使用。
@UiFactory SimplePager createSimplePager() {
    return new SimplePager(TextLocation.CENTER);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接