选择仅在第二次单击后使用枚举填充的SelectOneMenu

时间:2015-01-27 13:20:51

标签: primefaces enums jsf-2.2

我正在尝试使用枚举来填充PrimeFaces selectOneMenu,但无法获取所选值。 第一次点击后,分配的值始终是后构造函数中的值。

HTML:

<p:selectOneMenu id="periodo"
                 value="#{dashboardMB.enumDate}">
  <f:selectItems value="#{dashboardMB.enumDates}"
                 var="enumDate" 
                 itemValue="#{enumDate}"
                 itemLabel="#{enumDate.label}" />
</p:selectOneMenu>

支持bean:

private EnumDate enumDate;

@PostConstruct
public void init() {
    enumDate = EnumDate.YEAR;
}

EnumDate:

public enum EnumData {
    EMPTY("- Select -"), DAY("Day"), WEEK("Week"), FORTNIGHT("Fortnight"), MONTH("Month"), BIMESTER("Bimester"), TRIMESTER("Trimester"), SEMESTER("Semester"), YEAR("Year");
    public String label;
    public static final EnumSet<EnumDate> all = EnumSet.of(EMPTY, DAY, WEEK, FORTNIGHT, MONTH, BIMESTER, TRIMESTER, SEMESTER, YEAR);

    private EnumDate(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }
}

因此,它始终具有“年”的价值。直到再次点击发送表单的按钮。

使用OmniFaces转换器解决:

<p:selectOneMenu id="period"
                 converter="omnifaces.SelectItemsConverter"
                 style="width: 237px !important"
                 value="#{dashboardMB.enumDate}"
                 filter="true"
                 filterMatchMode="contains"
                 panelStyleClass="oneMenuPanel"
                 styleClass="oneMenu">
  <f:selectItems value="#{dashboardMB.enumDateArray}"
                 var="enum"
                 itemValue="#{enum}"
                 itemLabel="#{enum.label}" />
</p:selectOneMenu>

enumDateArray属性属于EnumDate[]类型。它的getter返回EnumDate.values()

2 个答案:

答案 0 :(得分:0)

最好使用omnifaces generic enum converter。与“手动”进行列表转换等相比,它可以使代码更清晰......

答案 1 :(得分:-1)

将枚举转换为字符串

EnumData[] eds = EnumData.values(); String EDtoString = eds[0].name();

您可以将函数String[] EnumDatasToString()传递给XHTML。

要从String转换为Enum,请使用

EnumData ed = EnumData.valueOf(EDToString);