[英]PrimeFaces selectOneMenu not rendering Images and Strings
我正在使用PrimeFaces selectOneMenu在它們旁邊顯示一些圖像和字符串,我只關心圖像旁邊的字符串,圖像本身僅用於顯示,我嘗試了此操作,但沒有成功:
<p:selectOneMenu id="SkinChooser"
value="#{personBean.skin}" panelStyle="width:150px"
effect="fade" var="s" style="width:160px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{personBean.selectedSkins}"
var="skin" itemLabel="#{skin.skinType}" itemValue="#{skin}" />
<p:column>
<p:graphicImage value="/resources/images/skin/#{s.skinPhoto}" />
</p:column>
<p:column>
#{s.skinType}
</p:column>
</p:selectOneMenu>
public class Skin {
String skinPhoto;
String skinType;
public Skin() {}
public Skin(String photo, String type) {}
public String getSkinPhoto() {return skinPhoto;}
public void setSkinPhoto(String skinPhoto) {
this.skinPhoto = skinPhoto;
}
public String getSkinType() {
return skinType;
}
public void setSkinType(String skinType) {
this.skinType = skinType;
}
@Override
public String toString() {
return skinType;
}
}
在bean personBean
內部,我按如下方式初始化ArrayList selectedSkins
:
這是personBean:
@ManagedBean(name = "personBean")
@SessionScoped
public class ReportPerson {
private Skin skin;
private static List<Skin> selectedSkins;
static {
System.err.println("Array is filled");
selectedSkins = new ArrayList<Skin>();
selectedSkins.add(new Skin("1", "Pale white"));
selectedSkins.add(new Skin("2", "Fair white"));
selectedSkins.add(new Skin("3", "Light brown"));
selectedSkins.add(new Skin("4", "Moderate brown"));
selectedSkins.add(new Skin("5", "Dark brown"));
selectedSkins.add(new Skin("6", "Deeply pigmented"));
System.err.println("Finished Filling");
}
public List<Skin> getSelectedSkins() {
return selectedSkins;
}
public void setSelectedSkins(List<Skin> selectedSkins) {
this.selectedSkins = selectedSkins;
}
public Skin getSkin() {
return skin;
}
public void setSkin(Skin skin) {
this.skin = skin;
}
}
但是selectOneMenu組件仍然無法呈現任何內容!
您缺少轉換器。
@ManagedBean(name = "skinConverter")
public class SkinConverter implements Serializable, Converter {
/** Serial Version UID. */
private static final long serialVersionUID = 3661819160508007879L;
@ManagedProperty(value = "#{personBean}")
private PersonBean personBean;
/**
* Accesses the personBean
* @return the personBean
*/
public final PersonBean getPersonBean() {
return personBean;
}
/**
* Sets the personBean
* @param personBean the personBean to set
*/
public final void setPersonBean(final PersonBean personBean) {
this.personBean = personBean;
}
/**
* @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext,
* javax.faces.component.UIComponent, java.lang.String)
*/
@Override
public Object getAsObject(final FacesContext facesContext, final UIComponent
component, final String submittedValue) {
if (submittedValue.trim().equals("")) {
return null;
} else {
for (Skin p : personBean.getSelectedSkins()) {
if (p.getSkinType().equals(submittedValue)) {
return p;
}
}
}
return null;
}
/**
* @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext,
* javax.faces.component.UIComponent, java.lang.Object)
*/
@Override
public String getAsString(final FacesContext arg0, final UIComponent arg1, final Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Skin) value).getSkinType());
}
}
}
為了將項目呈現為列,標記<f:selectItems>
的屬性itemValue
必須指向對象,而不是字符串。
您的情況是itemValue="#{skin}"
是正確的。
如果您使用itemValue="skin"
或itemValue="#{skin.type}"
,則該項目將顯示為普通文本,因為其類型為String
。
PrimeFaces源代碼將使其更加清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.