在JSF中动态更改h:datatable单元格颜色或样式

时间:2012-06-14 18:01:56

标签: jsf datatable

我有一个数据表,我希望根据对内容运行的某些分析来更改单元格的颜色。该表链接到一个Comment对象数组,我给出了一个String cssClass,它在运行分析后得到更新。这是我尝试插入数据表的rowClasses属性。它没有工作,我认为问题可能是我无法从数据表声明中访问为数据表的每一行创建的变量。

数据表代码:

<h:dataTable value="#{post.comments}" var="comment" class="hs-table" rowClasses="#{comment.cssClass}" >
             <h:column>
                   #{comment.name}
             </h:column>
             <h:column>
                   #{comment.email}
             </h:column>
             <h:column>
                   #{comment.msg}
             </h:column>
 </h:dataTable>

评论类:

public class Comment {
private String msg;
private String email;
private String name;
private Date date;
private String cssClass;

public Comment(){
    cssClass = "normColumn";
}
epublic String getCssClass() {
    return cssClass;
}

public void setCssClass(String cssClass) {
    this.cssClass = cssClass;
}

}

在托管bean中更新cssClass:

if(tone>0)
            c.setCssClass("commentPos");
        else if(tone<0)
            c.setCssClass("commentNeg");

该课程永远不会被分配。我做错了什么,或者这根本不可能?

1 个答案:

答案 0 :(得分:10)

在标准JSF <h:dataTable>组件中,遗憾的是,rowClasses属性不会按行计算。它是基于每个表进行评估的。但是,像Tomahawk和PrimeFaces这样的组件库支持您在<t:dataTable><p:dataTable>上寻找的属性。

使用标准JSF <h:dataTable>组件,您需要提供以逗号分隔的所有行类的字符串。这看起来像这样:

public String getRowClasses() {
    StringBuilder rowClasses = new StringBuilder();

    for (Comment comment : comments) {
        if (rowClasses.length() > 0) rowClasses.append(",");
        rowClasses.append(comment.getCssClass());
    }

    return rowClasses.toString();
}

然后被引用为

<h:dataTable ... rowClasses="#{post.rowClasses}">

另见: