How to organize Frames in Jasper Report so they fl

2019-02-17 09:39发布

问题:

In a Jasper report I have 4 Frames (below image) which have some properties set as shown in the same image.

Now, the idea is that given certain parameters showBlue and showRed the frames BLUE and RED respectively are shown or hidden and the subsequent frame "floats" after the previous one (taking in consideration the following order: BLUE <- RED <- GREEN) while BLACK should stay in the same place.

The two left frames (RED and GREEN) were floating up perfectly before the BLACK one was set in place. After that when I set the parameters showBlue and showRed to false (hide BLUE and RED frames) this is the result:

This is the jrxml for the report design:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
<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="Float_UP" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="6578bc34-0c2e-4179-99da-5ec1dd90a422">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="showBlue" class="java.lang.Boolean"/>
    <parameter name="showRed" class="java.lang.Boolean"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="211" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="400" height="12" uuid="54cb1704-59d8-4272-9ec1-db4cea913cd3"/>
                <text><![CDATA[Header 1 (right before conditional frame)]]></text>
            </staticText>
            <frame>
                <reportElement x="0" y="15" width="400" height="66" isRemoveLineWhenBlank="true" uuid="0140ba9b-f2f0-494c-82bc-caf6b5efc63e">
                    <printWhenExpression><![CDATA[$P{showBlue}]]></printWhenExpression>
                </reportElement>
                <box>
                    <pen lineWidth="3.0" lineColor="#2E0DD4"/>
                </box>
                <staticText>
                    <reportElement x="1" y="1" width="379" height="59" uuid="a8b7d505-a6ad-4359-9263-23ac087b19ff"/>
                    <textElement>
                        <font size="14"/>
                    </textElement>
                    <text><![CDATA[BLUE: `isRemoveLineWhenBlank=true` and `printWhenExpression` set]]></text>
                </staticText>
            </frame>
            <frame>
                <reportElement positionType="Float" x="0" y="85" width="400" height="60" isRemoveLineWhenBlank="true" uuid="c80dd879-ce81-4921-b17e-9882763a3f61">
                    <printWhenExpression><![CDATA[$P{showRed}]]></printWhenExpression>
                </reportElement>
                <box>
                    <pen lineWidth="3.0" lineColor="#F50A25"/>
                </box>
                <staticText>
                    <reportElement x="0" y="0" width="380" height="50" uuid="d0cadbd4-b436-47f4-a32d-2b00f0c6b147"/>
                    <textElement>
                        <font size="14"/>
                    </textElement>
                    <text><![CDATA[RED: `isRemoveLineWhenBlank=true`, `printWhenExpression` set and `positionType="Float"`]]></text>
                </staticText>
            </frame>
            <frame>
                <reportElement positionType="Float" x="2" y="151" width="398" height="60" uuid="e0a5ed13-d8f2-4acd-ac14-1f5633099542"/>
                <box>
                    <pen lineWidth="3.0" lineColor="#22B002"/>
                </box>
                <staticText>
                    <reportElement x="1" y="1" width="377" height="39" uuid="482471b4-4c3b-42c6-892d-f8c42ca320bf"/>
                    <textElement>
                        <font size="14"/>
                    </textElement>
                    <text><![CDATA[GREEN: `positionType="Float"`]]></text>
                </staticText>
            </frame>
            <frame>
                <reportElement x="420" y="15" width="130" height="70" uuid="8e057d80-72be-4f66-ae9b-ef80610daf36"/>
                <box>
                    <pen lineWidth="3.0"/>
                </box>
                <staticText>
                    <reportElement x="6" y="6" width="118" height="44" uuid="36d8e560-3af5-4edf-b9ef-9b9311877c3a"/>
                    <textElement>
                        <font size="14"/>
                    </textElement>
                    <text><![CDATA[BLACK]]></text>
                </staticText>
            </frame>
        </band>
    </detail>
</jasperReport>

And I have set up a Java Project with Swagger in case you want to run it with maven.

Q: How can I make frames RED and GREEN to properly "float-up" after its previous frame while frame BLACK stays in the same place?

回答1:

Yes the green will not float up since the black box is placed immediately above it

From JRElement API

Float - The element floats in its parent section if it is pushed downward by other elements found above it. It tries to conserve the distance between it and the neighboring elements placed immediately above it

Solution

The solutions obviously is to not have any element immediately above it and one way to achieve this is to use another frame or a subreport. If you need elements to float up also under this design you probably will need a subreport but I will show the parent frame solution, because it is the easiest way to solve your direct problem.

Example using a parent frame

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="Float_UP" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="6578bc34-0c2e-4179-99da-5ec1dd90a422">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="showBlue" class="java.lang.Boolean"/>
    <parameter name="showRed" class="java.lang.Boolean"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="96" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="400" height="12" uuid="54cb1704-59d8-4272-9ec1-db4cea913cd3"/>
                <text><![CDATA[Header 1 (right before conditional frame)]]></text>
            </staticText>
            <frame>
                <reportElement x="0" y="15" width="409" height="78" uuid="82076f1d-b7a9-4b63-ab4a-af54b0817a62"/>
                <frame>
                    <reportElement x="0" y="4" width="400" height="66" isRemoveLineWhenBlank="true" uuid="0140ba9b-f2f0-494c-82bc-caf6b5efc63e">
                        <printWhenExpression><![CDATA[$P{showBlue}]]></printWhenExpression>
                    </reportElement>
                    <box>
                        <pen lineWidth="3.0" lineColor="#2E0DD4"/>
                    </box>
                    <staticText>
                        <reportElement x="1" y="1" width="379" height="59" uuid="a8b7d505-a6ad-4359-9263-23ac087b19ff"/>
                        <textElement>
                            <font size="14"/>
                        </textElement>
                        <text><![CDATA[BLUE: `isRemoveLineWhenBlank=true` and `printWhenExpression` set]]></text>
                    </staticText>
                </frame>
                <frame>
                    <reportElement positionType="Float" x="-1" y="75" width="400" height="60" isRemoveLineWhenBlank="true" uuid="c80dd879-ce81-4921-b17e-9882763a3f61">
                        <printWhenExpression><![CDATA[$P{showRed}]]></printWhenExpression>
                    </reportElement>
                    <box>
                        <pen lineWidth="3.0" lineColor="#F50A25"/>
                    </box>
                    <staticText>
                        <reportElement x="0" y="0" width="380" height="50" uuid="d0cadbd4-b436-47f4-a32d-2b00f0c6b147"/>
                        <textElement>
                            <font size="14"/>
                        </textElement>
                        <text><![CDATA[RED: `isRemoveLineWhenBlank=true`, `printWhenExpression` set and `positionType="Float"`]]></text>
                    </staticText>
                </frame>
                <frame>
                    <reportElement positionType="Float" x="0" y="140" width="398" height="60" uuid="e0a5ed13-d8f2-4acd-ac14-1f5633099542"/>
                    <box>
                        <pen lineWidth="3.0" lineColor="#22B002"/>
                    </box>
                    <staticText>
                        <reportElement x="1" y="1" width="377" height="39" uuid="482471b4-4c3b-42c6-892d-f8c42ca320bf"/>
                        <textElement>
                            <font size="14"/>
                        </textElement>
                        <text><![CDATA[GREEN: `positionType="Float"`]]></text>
                    </staticText>
                </frame>
            </frame>
            <frame>
                <reportElement x="420" y="15" width="130" height="70" uuid="8e057d80-72be-4f66-ae9b-ef80610daf36"/>
                <box>
                    <pen lineWidth="3.0"/>
                </box>
                <staticText>
                    <reportElement x="6" y="6" width="118" height="44" uuid="36d8e560-3af5-4edf-b9ef-9b9311877c3a"/>
                    <textElement>
                        <font size="14"/>
                    </textElement>
                    <text><![CDATA[BLACK]]></text>
                </staticText>
            </frame>
        </band>
    </detail>
</jasperReport>

Output

Additional design notes

As you can see in output there is a 4px height difference between the green and black box, this is due to the empty space you have between the frames. If you need pixel perfect reports you need to have zero space between the components that you are removing/floating.



回答2:

Maybe you can try using multiple Detail bands for your report. Thus you can use the property printWhenExpresion on each band, instead of in each frame.

Here you can find your jrxml code modified with an example.