仅在第二次单击后选择用枚举填充的 SelectOneMenu
Selecting a SelectOneMenu populated with enum only after second click
我正在尝试使用枚举来填充 PrimeFaces selectOneMenu,但无法获取所选值。 第一次点击后,分配的值始终是post-构造函数中的值。
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;
}
枚举日期:
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;
}
}
因此,它始终具有值 "Year"。直到再次点击发送表单的按钮。
使用 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 returns EnumDate.values()
.
将枚举转换为字符串
EnumData[] eds = EnumData.values();
String EDtoString = eds[0].name();
您可以将函数 String[] EnumDatasToString()
传递给 XHTML。
要从字符串转换为枚举,请使用
EnumData ed = EnumData.valueOf(EDToString);
最好使用omnifaces generic enum converter。与 'manually' 进行列表转换等相比,它使您的代码更简洁...
我正在尝试使用枚举来填充 PrimeFaces selectOneMenu,但无法获取所选值。 第一次点击后,分配的值始终是post-构造函数中的值。
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;
}
枚举日期:
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;
}
}
因此,它始终具有值 "Year"。直到再次点击发送表单的按钮。
使用 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 returns EnumDate.values()
.
将枚举转换为字符串
EnumData[] eds = EnumData.values();
String EDtoString = eds[0].name();
您可以将函数 String[] EnumDatasToString()
传递给 XHTML。
要从字符串转换为枚举,请使用
EnumData ed = EnumData.valueOf(EDToString);
最好使用omnifaces generic enum converter。与 'manually' 进行列表转换等相比,它使您的代码更简洁...