这对于标准的<p:selectManyCheckbox> 是不可能的,至少对于这种动态来说是不可能的。如果它是静态值,您可以使用 CSS3 nth-child() 选择器。使用<p:selectManyCheckbox> 中的动态值,您基本上需要覆盖它的渲染器(这不是一项简单的工作)或发布功能请求(这可能需要比您想要的更长的时间)。
最好的办法是使用<ui:repeat> 或<h:dataTable>,而不是在每行基础上渲染一个<p:selectBooleanCheckbox>。这允许您在每个复选框的基础上指定 styleClass。这只需要对 selectedMovies 属性的填充方式进行技术更改。
这是一个具体的启动示例,<h:dataTable>(注意:<p:selectManyCheckbox> 本身也会生成一个<table>,所以布局技术上没有太大区别,如果桌子打扰你,你总是可以选择<ui:repeat>语义上):
<h:dataTable value="#{bean.movies}" var="movie" styleClass="ui-selectmanycheckbox ui-widget">
<h:column>
<p:selectBooleanCheckbox id="checkbox" converter="javax.faces.Boolean"
value="#{bean.checkedMovieIds[movie.id]}" styleClass="#{movie.type}" />
</h:column>
<h:column>
<p:outputLabel for="checkbox" value="#{movie.title}" />
</h:column>
</h:dataTable>
<p:commandButton value="Submit" actionListener="#{bean.collectMovies}" action="#{bean.submit}" />
注意事项:
-
<h:dataTable styleClass> 使用与<p:selectManyCheckbox> 完全相同的 CSS,因此复选框表看起来'n'feel 完全相同。
-
converter="javax.faces.Boolean"(实际上,令我惊讶的是)是强制性的,因为否则它将检查值true 和false 设置为String 而不是Boolean; <h:selectBooleanCheckbox>中不存在这个问题,可能是PF错误?
- 在这个特定用例中
styleClass="#{movie.type}" 比styleClass="#{movie.id}" 更有意义,因为为每个单独的“id”值指定一个单独的样式类似乎是一项可笑的任务,它通常代表一个唯一的自动分配的数据库标识符;如果需要,您可以随时在实际代码中更改它。
-
actionListener 在实际的action 方法之前收集selectedMovies。您当然也可以在实际的 action 方法中完成这项工作,但这样就不再那么干净地分开了。
支持 bean 看起来像这样(checkedMovieIds 假定 Movie 有一个 Long id 属性):
private List<Movie> movies;
private Map<Long, Boolean> checkedMovieIds;
private List<Movie> selectedMovies;
@PostConstruct
public void init() {
movies = populateItSomehow();
checkedMovieIds = new HashMap<Long, Boolean>();
}
public void collectMovies(ActionEvent event) {
selectedMovies = new ArrayList<Movie>();
for (Movie movie : movies) {
if (checkedMovieIds.get(movie.getId())) {
selectedMovies.add(movie);
}
}
}
public void submit() {
System.out.println(selectedMovies);
// ...
}
// +getters (note: no setters necessary for all those three properties)
假设#{movie.type} 可以具有值action、comedy、fantasy 和horror(顺便说一句,这是一个完美的enum 类型候选),那么您可以为各个复选框设置如下样式:
.action .ui-chkbox-box {
background-color: red;
}
.comedy .ui-chkbox-box {
background-color: orange;
}
.fantasy .ui-chkbox-box {
background-color: green;
}
.horror .ui-chkbox-box {
background-color: blue;
}