我想尝试使用Primefaces" SelectOneMenu"对于可能具有"正常"标签或"粗体"标签。我尝试了两种不同的变体,但两者都没有按预期工作。
变式1:
<p:selectOneMenu id="menu" value="#{selected}">
<f:selectItems value="#{mySelectItems}"/>
</p:selectOneMenu>
public List<SelectItem> getMySelectItems() {
List<SelectItem> list = new ArrayList<SelectItem>();
for (...) {
SelectItem item = new SelectItem(value, label);
item.setEscape(false);
if (...)
item.setLabel("<b>" + item.getLabel() + "</b>");
list.add(item);
}
return list;
}
这样我可以在菜单中添加一些带有粗体标签的项目和一些带有普通标签的项目。问题:显示当前选择的字段将文本显示为&#34;&lt; b&gt; ...&lt; / b&gt;&#34;。文本似乎没有被转义,但似乎它不能显示为粗体,因为它在HTML标签内。我不知道如何摆脱&#34;&lt; b&gt;&#34;和&#34;&lt; / b&gt;&#34;但是,在那个标签上。
变式2:
<p:selectOneMenu id="menu" value="#{selected}" var="myClass">
<f:selectItems value="#{myClasses}"/>
<p:column>
<h:outputText value="#{myClass.name}" styleClass="bold"/>
</p:column>
</p:selectOneMenu>
public List<MyClass> getMyClasses() {
List<MyClass> list = new ArrayList<MyClass>();
...
return list;
}
使用此变体,我还可以在菜单中为项目(当前所有项目)添加粗体标签。问题是:显示当前选择的文本不显示&#34; myClass.getName()&#34;,而是&#34; myClass.toString()。菜单中的标签是正确的。有办法解决这个问题吗?
如果我写...
<f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar.value}" itemLabel="#{myVar.name}"/>
相反,它不会再将菜单中的项显示为粗体,但它在当前选择的字段中使用getName()而不是toString()。
有谁知道如何让我的想法按照我希望他们的方式工作,或者对如何解决这个问题有更好的想法?
提前致谢!
答案 0 :(得分:0)
在变式2中,您需要通过实施MyClass
为javax.faces.convert.Converter
提供转换器。转换器只需要选择(它生成对象的字符串表示形式(实例的唯一id)并在处理后将其转换回对象)。为了正确表示所选值,您需要将此属性添加到selectItems:<f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar}" itemLabel="#{myVar.name}"/>
。
<h:outputText styleClass="bold"...
仅对selectItems列表有效。要更改所选项目的样式,您需要将styleClass
添加到p:selectOneMenu
。在你的情况下:
<p:selectOneMenu id="menu" value="#{view.selection}" converter="#{view.myClassConverter}"
var="v" style="#{(view.selection.name eq 'bold-name') ? 'font-style: bold' : null}">
<f:selectItems value="#{view.myClasses}" var="mc"
itemLabel="#{mc.name}" itemValue="#{mc}"/>
<p:column>
<h:outputText value="#{v.name}" style="#{(v.name eq 'bold-name') ? 'font-style: bold' : null}"/>
</p:column>
<p:ajax event="change" update="menu" process="@this"/>