1

要求:

如果firstNamelastName不为空。在 x=125, y=3 坐标处显示。并在 x="125" y="26" 坐标处显示地址。这工作正常。

问题:如果 firstName/lastName 为空,那么我们需要将地址元素向上移动并显示在 x=125,y=3 坐标本身。

这就是我卡住的地方。请帮我。

请参考下面我的 jrxml 文件:

<frame>
    <reportElement key="frame-462" positionType="Float" mode="Transparent" x="0" y="50" width="390" height="70"/>
    <textField isStretchWithOverflow="true" isBlankWhenNull="true" evaluationTime="Now">
        <reportElement key="textField-844" positionType="Float" mode="Transparent" x="125" y="3" width="264" height="23"
                       isPrintWhenDetailOverflows="true" isRemoveLineWhenBlank="true">
            <printWhenExpression><![CDATA[(!$F{firstName}.isEmpty() && !$F{lastName}.isEmpty())]]></printWhenExpression>
        </reportElement>
        <textElement markup="styled">
            <font fontName="Verdana" size="12"/>
        </textElement>
        <textFieldExpression>
            <![CDATA[$F{firstName} +  "<style pdfFontName='Helvetica-Oblique' size='11'>" + $F{lastName} + "</style>"]]></textFieldExpression>
    </textField>
    <textField isStretchWithOverflow="true" isBlankWhenNull="true" evaluationTime="Now">
        <reportElement key="textField-843" mode="Transparent" positionType="Float" x="125" y="26" width="264"
                       height="42" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true"/>
        <textElement markup="html">
            <font fontName="Verdana" size="12"/>
        </textElement>
        <textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
    </textField>
    <staticText>
        <reportElement key="staticText-1249" positionType="Float" x="2" y="2" width="108" height="21"
                       isRemoveLineWhenBlank="true"/>
        <textElement textAlignment="Left">
            <font fontName="Verdana" size="12" isBold="false" pdfFontName="Helvetica-Bold"/>
        </textElement>
        <text><![CDATA[ Address:]]></text>
    </staticText>
</frame>
4

1 回答 1

3

您已经设置了isRemoveLineWhenBlank属性,该属性将删除textField. 但是,JasperReports 不能折叠垂直空间,除非该空间完全清除。如果有另一个元素占据同一行(在您的情况下是staticText元素),则将保留空白空间。这有点像反过来玩俄罗斯方块;你必须在这条线消失之前摆脱所有的块。

将报表元素放入框架会稍微修改此行为。需要明确的只是父框架的宽度,而不是整个报表的宽度。因此,通过将您的姓名和地址字段放入单独的框架中,尽管与静态文本水平对齐,但姓名字段占用的空间可能会折叠。我已经修改了您的代码片段来证明这一点:

<frame>
    <reportElement key="frame-462" positionType="Float" mode="Transparent" x="0" y="50" width="390" height="70"/>
    <frame>
        <reportElement x="126" y="0" width="264" height="70"/>
        <textField isStretchWithOverflow="true" isBlankWhenNull="true" evaluationTime="Now">
            <reportElement key="textField-844" positionType="Float" mode="Transparent" x="0" y="3" width="264" height="23" isPrintWhenDetailOverflows="true" isRemoveLineWhenBlank="true">
                <printWhenExpression><![CDATA[(!$F{firstName}.isEmpty() && !$F{lastName}.isEmpty())]]></printWhenExpression>
            </reportElement>
            <textElement markup="styled">
                <font fontName="Verdana" size="12"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{firstName} +  "<style pdfFontName='Helvetica-Oblique' size='11'>" + $F{lastName} + "</style>"]]></textFieldExpression>
        </textField>
        <textField isStretchWithOverflow="true" isBlankWhenNull="true" evaluationTime="Now">
            <reportElement key="textField-843" mode="Transparent" positionType="Float" x="0" y="26" width="264" height="42" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true"/>
            <textElement markup="html">
                <font fontName="Verdana" size="12"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
        </textField>
    </frame>
    <staticText>
        <reportElement key="staticText-1249" positionType="Float" x="2" y="2" width="108" height="21" isRemoveLineWhenBlank="true"/>
        <textElement textAlignment="Left">
            <font fontName="Verdana" size="12" isBold="false" pdfFontName="Helvetica-Bold"/>
        </textElement>
        <text><![CDATA[ Address:]]></text>
    </staticText>
</frame>
于 2013-04-03T09:55:19.263 回答