1

我希望我的 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

4

1 回答 1

0

只要MyWidgetLabels可以由 GWT.create 创建,您就可以将任何您想要的内容放入该类型中,并且您可以使其行为随心所欲。正如您在帖子末尾建议的那样,您将需要create在您的 uibinder 中引用来实际构建对象,因此您的行将如下所示:

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

每个.单独的部分(除了第一个部分,它是一个 ui:field/@UiField)都是一个要调用的无参数方法 - 您在 中声明labels()MyWidgetResources已经create()存在于 中GwtCreateResource,并且您title()以自己的MyWidgetLabels类型创建。

由于第一部分是 ui:field/@UiField,因此您可以使用另一个res.labels.create类似的引用,labels以便稍后您可以说:

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

最后,是的,您可以构建自己的 ResourceGenerator ,只要您扩展ResourcePrototype类型并拥有getName()方法,您就可以做任何您想做的事情来发出相关类型。

于 2013-08-26T22:05:40.423 回答