【问题标题】:PrimeFaces selectOneMenu not rendering Images and StringsPrimeFaces selectOneMenu 不呈现图像和字符串
【发布时间】:2013-05-28 12:55:01
【问题描述】:

我正在使用 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 组件仍然没有渲染任何东西!

【问题讨论】:

  • 请发布您的托管 bean 的代码。
  • @Luiggi Mendoza,已编辑

标签: java jsf-2 primefaces selectonemenu


【解决方案1】:

您缺少转换器。

@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());
    }

}

}

【讨论】:

  • OP的问题不是表单的提交,而是表单的渲染。到目前为止发布的代码在该步骤中不需要转换器。
  • @BalusC 你在哪里看到问题?
  • @BalusC 你是对的..转换器不是解决方案。只有将 itemValue 设置为 #{skinvar} 对我有用。
【解决方案2】:

为了将项目呈现为列,标签&lt;f:selectItems&gt; 的属性itemValue 必须指向一个对象,而不是一个字符串。

在您的情况下,itemValue="#{skin}" 是正确的。

如果您使用itemValue="skin"itemValue="#{skin.type}",则该项目将呈现为普通文本,因为它的类型是String

PrimeFaces 源代码会更清楚。

参考:SelectOneMenu.java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2016-05-03
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多