使用Gwt Create Resource以编程方式提供文本

时间:2013-08-26 18:17:41

标签: gwt resources uibinder gwtp clientbundle

我希望我的uiBinder使用ClientBundle,它将提供一些运行时自定义标签。一种TextResource,但不是来自文本文件!
我尝试使用GwtCreateResource,但是从DevGuide看起来似乎不可能。我对吗 ? (create()和name()是唯一可用的方法) 我想要实现的是这样的:

客户端包:

public interface MyWidgetResources extends ClientBundle {
    GwtCreateResource<WidgetLabels> labels();

    @Source("lol.css")
    CssResource style();
}

标签类:

public final class MyWidgetLabels {
    public String title() {
        return load("mywidget-title");
    }

    public String banner() {
        return load("mywidget-banner");
    }

    private String load(String key) {
        // load from external..
    }
}

UiBinder的:

<ui:with type="com.package.MyWidgetResources" field="res"/>

<gwt:SimplePanel>
    <gwt:Label text="{res.labels.title}"></gwt:Label>
    <gwt:Label text="{res.labels.banner}"></gwt:Label>
</gwt:SimplePanel>

我的代码已经是这样但res.label.title不起作用,因为GwtCreateResource只能作为类实例化器(res.labels.create().title())。

我有解决方案吗?也许使用自定义ResourceGenerator

1 个答案:

答案 0 :(得分:0)

只要GWT.create可以创建MyWidgetLabels,您就可以将任何想要的内容添加到该类型中,并且可以使其按照您的喜好行事。您将需要在帖子末尾建议的uibinder中使用create引用来实际构建对象,因此您的行将看起来像这样:

<gwt:Label text="{res.labels.create.title}"></gwt:Label>

每个.分隔的部分(第一部分除外,它是一个ui:field / @UiField)是一个无法调用的方法 - 你在labels()中声明了MyWidgetResourcescreate()中已存在GwtCreateResource,您在自己的title()类型中创建了MyWidgetLabels

由于第一部分是ui:field / @ UiField,你可以让另一部分像res.labels.create那样引用labels,以便稍后你可以说:

<gwt:Label text="{labels.title}"></gwt:Label>

最后,是的,您可以构建自己的ResourceGenerator,只要您扩展ResourcePrototype类型并使用getName()方法,就可以让您执行任何想要发出相关类型的内容