В отчетах jasper вы можете не сжимать элементы, вместо этого вам нужно растягивать их при необходимости.
В вашем случае это означает, что ваши фреймы в отчете нуждаютсячтобы получить минимальный необходимый вам размер, тогда, если в них будет больше контента, вы растягиваете его.
Например, ваш первый кадр
<frame>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="554" height="71" isRemoveLineWhenBlank="true" uuid="603f6666-1471-4d16-b0aa-bde352f18b8e">
......
всегда будет иметь минимальную высоту71, если он должен быть меньше (когда некоторые компоненты не отображаются), вам нужно уменьшить это значение, например, до 10.
Чтобы объяснить это поведение, я приложу небольшой пример с рамкой (имеет рамку), которая содержит 2 статических текстовых поля, а второе будет отображаться на основе параметра.
<?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="Blank_A4_3" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="53801704-697f-43ac-aed6-9e952be4ab7f">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="ShowText2" class="java.lang.Boolean">
<defaultValueExpression><![CDATA[true]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[]]>
</queryString>
<title>
<band height="96" splitType="Stretch">
<frame>
<reportElement stretchType="ElementGroupHeight" x="0" y="0" width="545" height="30" uuid="6ca5ba0c-b9c0-4ae9-be7f-e7a372593e94"/>
<box>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<staticText>
<reportElement x="0" y="0" width="100" height="30" uuid="7291cb69-0d98-4ce2-8031-60b5c6df4ebb"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Static text 1]]></text>
</staticText>
<staticText>
<reportElement x="0" y="30" width="100" height="30" isRemoveLineWhenBlank="true" uuid="7df247c0-2c72-4413-83f5-3d4d3aec258c">
<printWhenExpression><![CDATA[$P{ShowText2}]]></printWhenExpression>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Static text 2]]></text>
</staticText>
</frame>
</band>
</title>
</jasperReport>
Вывод
Не отображать второе текстовое поле
Отображение второго текстового поля
Ключевой концепцией является то, что кадр имеет height="30"
, что является не растянутым значением (минимумм) и вместо этого он растягивается до height="60"
, если отображается второе текстовое поле.
Примечание: я использую stretchType="ElementGroupHeight"
, поскольку stretchType="RelativeToTallestObject"
устарела.