这对于标准是不可能的<p:selectManyCheckbox>,至少对于这种动态来说是不可能的。如果它是静态值,您可以使用 CSS3nth-child()选择器。使用 a 中的动态值<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>与 完全相同的 CSS <p:selectManyCheckbox>,因此复选框表看起来'n'feel 完全相同。
- (实际上,令我惊讶的
converter="javax.faces.Boolean"是)是强制性的,因为否则它会设置检查值true,false而String不是Boolean; 这个问题不存在<h:selectBooleanCheckbox>,也许是 PF 错误?
- 在
styleClass="#{movie.type}"这个特定的用例中比 更有意义styleClass="#{movie.id}",因为为每个单独的“id”值指定一个单独的样式类似乎是一项荒谬的任务,它通常代表一个唯一的自动分配的数据库标识符;如果需要,您可以随时在实际代码中更改它。
- 完成在实际方法之前
actionListener收集的工作。你当然也可以用实际的方法来完成这项工作,但是这样就不再那么干净地分开了。selectedMoviesactionaction
支持 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候选类型),那么您可以按如下方式设置各个复选框的样式:fantasyhorrorenum
.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;
}