これは標準では不可能であり<p:selectManyCheckbox>、少なくともこの種のダイナミクスでは不可能です。静的な値の場合は、CSS3nth-child()セレクターを使用できます。に動的な値を使用すると<p:selectManyCheckbox>、基本的にレンダラーをオーバーライドするか (これは簡単な作業ではありません)、機能リクエストを投稿する必要があります (必要以上に時間がかかる場合があります)。
あなたの最善の策は、行ごとに単一をレンダリングする代わりに<ui:repeat>orを使用することです。これにより、チェックボックスごとに を指定できます。これには、プロパティの設定方法の技術的な変更のみが必要です。<h:dataTable><p:selectBooleanCheckbox>styleClassselectedMovies
これは具体的なキックオフの例です<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>ため、チェックボックス テーブルのルックアンドフィールはまったく同じです。
- これは (実際には
converter="javax.faces.Boolean"驚いたことに) 必須です。この問題は には存在しません。おそらく PF のバグですか?truefalseStringBoolean<h:selectBooleanCheckbox>
- この特定のユース ケースで作成された は、通常は一意の自動割り当て DB 識別子を表す個々の「id」値ごとに個別のスタイル クラスを指定するのはばかげているように見えるため、
styleClass="#{movie.type}"よりも理にかなっています。styleClass="#{movie.id}"必要に応じて、実際のコードでいつでも変更できます。
- は、実際のメソッド
actionListenerの前に を収集するジョブを実行します。もちろん、実際のメソッドでジョブを実行することもできますが、これはもはやそれほど明確に分離されていません。selectedMoviesactionaction
バッキング Bean は次のようになります (プロパティがあるcheckedMovieIdsと仮定します)。MovieLong 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;
}