这对于标准是不可能的<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
收集的工作。你当然也可以用实际的方法来完成这项工作,但是这样就不再那么干净地分开了。selectedMovies
action
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;
}