Karim Oukara Karim Oukara - 11 days ago 5
Java Question

dynamically change cell values ​​and css style of <h: DataTable

how to calculate cell values of B column and how to change their css style dynamically
how to calculate the values of column B and how to change his color

my java object :

public class MyObject{
private Date date;
private int A;
private int C;

//Getters & Setters
}


my managed bean :

public class MyBean(){
List<MyObject> List = myObjectDao.FindAll();

//Getters & Setters
}


my jsf code :

<p:dataTable id="idList" var="list" value="#{myBean.list}" >
<p:column headerText="DATE">
<h:outputText value="#{list.date}" />
</p:column>
<p:column headerText="A">
<h:outputText value="#{list.A}" />
</p:column>
<p:column headerText="B">
<h:outputText value="????????" style="???????" //>
</p:column>
<p:column headerText="C">
<h:outputText value="#{list.C} />
</p:column>
</p:dataTable>

Answer

You can just use the conditional operator ?: in EL.

E.g.

<c:set var="B" value="#{(list.A / list.C) * 100}" />
<h:outputText value="#{B}" style="display: block; background-color: #{B lt 50 ? 'red' : (B lt 90 ? 'blue' : 'green')}" />

If B is also used elsewhere in the model or controller, then you could add a public int getB() method which just contains return (A/C) * 100; and then use #{list.B} instead of #{B}.

Note that proper design is to use a CSS class instead. E.g.

<h:outputText value="#{B}" styleClass="percentage #{B lt 50 ? 'poor' : (B lt 90 ? 'average' : 'good')}" />

with

td .percentage {
    display: block;
}

.percentage.poor {
    background-color: red;
}

.percentage.average {
    background-color: blue;
}

.percentage.good {
    background-color: green;
}

You can of course also perform the determination of CSS style/class in a getter method as suggested by the other answer, but that's a poor separation of concerns.