【问题标题】:Can I use enum values as field values inside UiBinder template?我可以在 UiBinder 模板中使用枚举值作为字段值吗?
【发布时间】:2026-01-31 05:30:02
【问题描述】:

我可以在 UiBinder 模板中使用枚举值作为字段值吗?我正在使用 GWT 2.4

类似的东西

<ui:with field="en" type="com.mine.courierApp.shared.PayerType" />

看起来很有希望,在哪里

public enum PayerType
{
    Sender,
    Recipient
}

但我不能通过en.Sender 引用枚举的值。

有可能吗?

【问题讨论】:

    标签: gwt gwt2 uibinder


    【解决方案1】:
    <ui:import field='com.mine.courierApp.shared.PayerType.Sender' />
    

    <ui:import field='com.mine.courierApp.shared.PayerType.*' />
    

    然后你可以将它用作payerType='{Sender}'

    但是 UiBinder 应该自动尝试将枚举常量名称转换为值,因此以下应该可以工作,而不需要 ui:with

    <my:MyWidget payerType='Sender' />
    

    如果MyWidget 小部件有public void setPayerType(PayerType type) 方法,UiBinder 应该在PayerType 枚举(来自方法的参数类型)中查找名为Sender 的枚举值(来自*.ui.xml 文件)。

    【讨论】:

    • 不幸的是它在运行时失败说:ERROR: Returns class com.mine.courierApp.shared.PayerType, can't be used as class java.lang.String
    • Thomas,能否请您也看看this question?您对 GWT 内部了解很多。
    • 抱歉,应该是 ui:import 而不是 ui:with。我刚刚签入了unit-tests for the feature(您可以查看EnumeratedLabel,了解自动将字符串转换为枚举值的示例。
    • 非常感谢!对于那些偶然发现这一点的人来说,有一个重要的注意事项。 您必须将.name 添加到您的枚举中,以便在必要时将其转换为字符串。我将修改答案以反映这一点。
    • 注意是否在编译器中启用了 Enum ellison。
    【解决方案2】:

    如果你不 ui:import 这样的枚举类:

    <ui:import field='com.mine.courierApp.shared.PayerType.*' />
    

    那么你就没有获得内容辅助,这首先就是重点。

    但是你遇到了另一个问题......

    虽然您可以简单地键入 { ctrl-space } 来获取枚举值的弹出菜单,但如果您使用的是 bootstrap3,则有各种枚举,每个枚举都有自己的“DEFAULT”值。 ui 模板编辑器会抱怨这一点;即,如果您开始广泛使用此内容辅助功能,则需要确保导入的枚举具有唯一的值名称。

    【讨论】:

      最近更新 更多