Search code examples
jasper-reports

How to create property with condition / dynamic foreground color?


I have a simple text field in a subreport.

Goal: Apply "propertyExpression" for "Forecolor" only when the parameter "evenRow" is 1

Following does not work but I gave it a try...

<textField>
  <reportElement key="" mode="Transparent" x="108" y="1" width="76" height="13">
    <propertyExpression name="net.sf.jasperreports.style.forecolor">
        <![CDATA[$P{evenRow} == 1 ? $P{colorZebra1_text} : ""]]>
    </propertyExpression>
  </reportElement>
  <textElement><font fontName="SansSerif" size="8"/></textElement>
  <textFieldExpression>"Text"</textFieldExpression>
</textField>

Context: The parent report calls this! subreport which contains the textfield multiple times (illustrated in attached image). Each time it is called the parent report sends the parameter "evenRow" as either 1 or 0...

//snipped from parent report to show that "evenRow" is 1 or 0
($V{REPORT_COUNT}.intValue() % 2 == 0 ?   1 :    0)

Question: How can I create a propertyExpression for the dynamic "Forecolor" that only comes to effect when my parameter "evenRow" is set to 1 ?

enter image description here

Note: I am aware I could use conditional styles -> The problem with styles in general is that they are never dynamic, i.e. I would have to create 1 style for every single color that 'could' be set ...and because the color can be set to whatever hex value this is not an option.


Solution

  • The concept of using net.sf.jasperreports.style.forecolor is working well with propertyExpression at practice.

    Single report with parameters

    Here is small template with parameters used at propertyExpression:

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Style forecolor" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
        <parameter name="color" class="java.lang.String">
            <defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
        </parameter>
        <parameter name="isApplyColor" class="java.lang.Boolean">
            <defaultValueExpression><![CDATA[true]]></defaultValueExpression>
        </parameter>
        <parameter name="DEFAULT_COLOR" class="java.lang.String" >
            <defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
        </parameter>
        <title>
            <band height="79" splitType="Stretch">
                <textField>
                    <reportElement x="211" y="39" width="100" height="30" uuid="4af3eb91-2334-40fe-a77a-45378fe93210">
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{isApplyColor} ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
                    </reportElement>
                    <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
                </textField>
            </band>
        </title>
    </jasperReport>
    

    The output result generated at JSS looks like this:

    Preview at JSS

    I used "#000000" (black) as default color.

    Looks like you need to check and fix the value of $P{evenRow}

    Sample with subreport and master report.

    I used subreport with parameters at propertyExpression like at first example. This report is using "external" parameter, but there is no difference - it is just a parameter

    Subreport's jrxml:

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Subreport" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
        <parameter name="color" class="java.lang.String">
            <defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
        </parameter>
        <parameter name="DEFAULT_COLOR" class="java.lang.String">
            <defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
        </parameter>
        <parameter name="evenRow" class="java.lang.Integer"/>
        <title>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement x="130" y="0" width="100" height="20">
                        <property name="com.jaspersoft.studio.unit.height" value="pixel"/>
                        <propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{evenRow} == 0 ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
                    </reportElement>
                    <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="20" y="0" width="100" height="20"/>
                    <textFieldExpression><![CDATA["evenRow: " + $P{evenRow}]]></textFieldExpression>
                </textField>
            </band>
        </title>
    </jasperReport>
    

    The 2nd textField is just for checking value of $P{evenRow}.

    The design is very simple:

    Design at JSS

    The main report is using this subreport

    The jrxml of master report:

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Master" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="10 empty rows"/>
        <detail>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement x="0" y="0" width="100" height="20"/>
                    <textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
                </textField>
                <subreport>
                    <reportElement x="130" y="0" width="200" height="20"/>
                    <subreportParameter name="evenRow">
                        <subreportParameterExpression><![CDATA[($V{REPORT_COUNT}  % 2 == 0 ?  1 :  0)]]></subreportParameterExpression>
                    </subreportParameter>
                    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
                    <subreportExpression><![CDATA["Subreport.jasper"]]></subreportExpression>
                </subreport>
            </band>
        </detail>
    </jasperReport>
    

    The textField is used for showing row number.

    The desing looks like:

    The master report at JSS

    The output result at JSS:

    Preview at JSS