我正在尝试在p:selectOneMenu
组件中显示所有可用的FontAwesome图标。
渲染器应首先渲染图标,然后显示图标的名称。可以在此处找到类似的示例,但特别针对BootStrap实现:https://mjolnic.com/fontawesome-iconpicker/
---------------------------------- |- ICON - | Icon name | ----------------------------------
不幸的是,自定义列不会被渲染。 p:selectOneMenu
出现,但默认情况下呈现为。
我的选择器xhtml页面如下所示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<body>
<p:panel>
<h:form id="iconPicker">
<p:selectOneMenu id="iconSelectOneMenu"
value="#{iconController.availableIconStrings}">
<f:selectItem itemLabel="Choose icon"
noSelectionOption="true" />
<f:selectItems
value="#{categoryController.availableIconStrings}"
var="_icon" itemValue="#{_icon}"
itemLabel="#{_icon}" />
<p:column>
<p:button id="iconButton" icon="#{_icon}" />
</p:column>
<p:column>
<h:outputText value="#{_icon}" />
</p:column>
</p:selectOneMenu>
</h:form>
</p:panel>
</body>
</html>
IconController
类:
public class IconController implements Serializable {
private List<String> availableIconStrings;
public IconController() { }
@PostConstruct
public void init() {
availableIconStrings = new ArrayList<>();
availableIconStrings.addAll(Arrays
.asList("fa-adjust,fa-adn,fa-align-center,fa-align-justify,fa-align-left,"
+ "fa-align-right,fa-ambulance,fa-anchor,fa-android,fa-angellist,"
+ "fa-angle-double-down,fa-angle-double-left,fa-angle-double-right,"
+ "fa-angle-double-up,fa-angle-down,fa-angle-left,fa-angle-right"
// Shortened list
.split(",")));
}
public List<String> getAvailableIconStrings() {
return availableIconStrings;
}
public void setAvailableIconStrings(List<String> availableIconStrings) {
this.availableIconStrings = availableIconStrings;
}
}
如您所见,我正在尝试使用p:button
渲染图标。我是否正确理解我需要一个能够显示图标的PrimeFaces组件(例如p:button
,p:commandButton
,p:commandLink
)以实现我的目标?
感谢任何帮助。非常感谢。
P.S。:在WildFly 9.0.2上使用PrimeFaces 5.3,JSF 2.2和Mojarra
答案 0 :(得分:2)
为了简单和可重用,我决定将String
包装在Icon
类中,而不是按照BalusC在解决方法中建议的那样实现不同的Renderer
类( https://stackoverflow.com/a/32740430/2118909)。
public class Icon {
private String fontIconName;
public Icon(String fontIconName) {
this.fontIconName = fontIconName;
}
public String getFontIconName() {
return fontIconName;
}
public void setFontIconName(String fontIconName) {
this.fontIconName = fontIconName;
}
}
JSF页面如下所示:
<p:selectOneMenu id="iconSelectOneMenu"
value="#{iconController.selectedIcon}" var="_icon" converter="#{iconConverter}">
<f:selectItem itemLabel="Choose icon"
noSelectionOption="true" />
<f:selectItems
value="#{categoryController.availableIcons}" itemValue="#{_icon}"
itemLabel="#{_icon.fontIconName}" />
<p:column>
<i class="fa fa-fw #{_icon.fontIconName}"/>
</p:column>
<p:column>
<h:outputText value="#{_icon.fontIconName}" />
</p:column>
</p:selectOneMenu>
请注意以下事项:
#{iconController.selectedIcon}
现在指的是Icon
类#{iconController.availableIcons}
现在指的是List<Icon>
实例Converter
课程添加了Icon
。 <i/>
元素呈现。请注意customContent
方法中var
变量的重要性和作用,表明您需要在p:selectOneMenu
上直接<f:selectItems/>
值(不在<f:selectItems/> var
元素!)或渲染器无法识别自定义内容,因为它不会评估uses_allocator<use_arg, allocator<use_arg>>
属性。
答案 1 :(得分:1)
两件事:
要将p:column
与p:selectOneMenu
结合使用,您需要在var
上声明p:selectOneMenu
属性,并在p:column
中引用它。可以在PrimeFaces showcase上找到一个示例。
所以你的代码应该是:
<p:selectOneMenu id="iconSelectOneMenu"
value="#{iconController.availableIconStrings}" var="ic">
<f:selectItem itemLabel="Choose icon"
noSelectionOption="true" />
<f:selectItems
value="#{categoryController.availableIconStrings}"
var="_icon" itemValue="#{_icon}"
itemLabel="#{_icon}" />
<p:column>
<p:button id="iconButton" icon="#{ic}" />
</p:column>
<p:column>
<h:outputText value="#{ic}" />
</p:column>
</p:selectOneMenu>
现在,您正面临一个错误,因为您使用的List<String>
正如this所解释的那样问题:
因此,如果项值是String的实例,则完全忽略通过
p:column
的自定义内容。
您可以在同一帖子中找到解决方法:https://stackoverflow.com/a/32740430/2118909