You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JasperReports 6.20中jr:list元素垂直排列失效重叠问题求助

JasperReports 6.20中jr:list组件元素动态垂直排列解决方案

问题描述

使用JasperReports 6.20版本,在jr:list组件中需迭代展示两个文本框,期望二者垂直上下排列,但生成的报告中元素出现重叠。因中间需加入可动态扩展的子列表,无法直接使用固定y值。已尝试positionType="Float"等属性但无效,尝试子报表和bands方案时,子列表会为每个元素重复迭代导致显示元素过多,现寻求实现列表元素动态垂直排列的解决方法。

原示例代码

<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
    <datasetRun subDataset="TableGroup" uuid="28256056-95ed-4ce9-80ee-47a10ede48f1">
       <datasetParameter name="myObject">
          <datasetParameterExpression><![CDATA[$P{myObject}]]></datasetParameterExpression>
       </datasetParameter>
       <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{myObject}.getMyList())]]></dataSourceExpression>
    </datasetRun>
    <jr:listContents height="250" width="500">
       <frame>
          <reportElement x="0" y="0" width="500" height="250" uuid="566f22c8-abbe-4709-962c-c393366555bf"/>
          <textField textAdjust="StretchHeight">
             <reportElement positionType="Float" stretchType="ContainerHeight" x="0" y="0" width="200" height="20" uuid="e8873bea-aa28-4439-b4cf-3fd40b487ae6"/>
             <textFieldExpression><![CDATA[$F{elementOne}]]></textFieldExpression>
          </textField>
          <textField textAdjust="StretchHeight">
             <reportElement positionType="Float" stretchType="ContainerHeight" x="0" y="0" width="310" height="20" uuid="fb38a2e3-f141-472b-9fe0-fd1b998eb611"/>
             <textFieldExpression><![CDATA[$F{elementTwo}]]></textFieldExpression>
          </textField>
       </frame>
    </jr:listContents>
</jr:list>

解决方法

1. 修正元素基础位置与拉伸属性

原代码中两个文本框y值都设为0是重叠的核心原因,需给第二个文本框设置初始y值(比如等于第一个文本框的高度),同时调整以下关键属性:

  • 父容器frame的stretchType设为ContainerHeight,让容器能跟随内部元素的拉伸自动扩展高度
  • 第二个文本框的positionType设为Float,stretchType设为RelativeToTallestObject,确保它能在第一个文本框或中间子列表拉伸后自动下移

2. 嵌套动态子列表的正确配置

在两个文本框之间加入子列表时,需保证子列表能动态扩展,且后续元素能跟随其调整位置:

  • 子列表的reportElement设置positionType="Float"和stretchType="ContainerHeight",初始y值设为第一个文本框的高度
  • 子列表的jr:listContents设置合适的最小高度,内部元素也要配置stretchType="ContainerHeight"和textAdjust="StretchHeight",确保子列表内容能正确扩展

3. 调整listContents的高度

不要给jr:listContents设置固定的大高度(比如原代码中的250),改为设置初始元素高度之和的最小高度,让它能根据内容自动拉伸,避免多余空白或内容截断。

修改后的示例代码(含动态子列表)

<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
    <datasetRun subDataset="TableGroup" uuid="28256056-95ed-4ce9-80ee-47a10ede48f1">
       <datasetParameter name="myObject">
          <datasetParameterExpression><![CDATA[$P{myObject}]]></datasetParameterExpression>
       </datasetParameter>
       <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{myObject}.getMyList())]]></dataSourceExpression>
    </datasetRun>
    <jr:listContents height="60" width="500">
       <frame>
          <reportElement stretchType="ContainerHeight" x="0" y="0" width="500" height="60" uuid="566f22c8-abbe-4709-962c-c393366555bf"/>
          <!-- 第一个文本框 -->
          <textField textAdjust="StretchHeight">
             <reportElement stretchType="RelativeToTallestObject" x="0" y="0" width="200" height="20" uuid="e8873bea-aa28-4439-b4cf-3fd40b487ae6"/>
             <textFieldExpression><![CDATA[$F{elementOne}]]></textFieldExpression>
          </textField>
          <!-- 动态子列表 -->
          <jr:list printOrder="Vertical">
              <datasetRun subDataset="SubListDataset" uuid="a1b2c3d4-e5f6-7890-abcd-1234567890ab">
                  <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subList})]]></dataSourceExpression>
              </datasetRun>
              <jr:listContents height="20" width="500">
                  <textField textAdjust="StretchHeight">
                      <reportElement stretchType="ContainerHeight" x="0" y="0" width="500" height="20" uuid="a1b2c3d4-e5f6-7890-abcd-1234567890ac"/>
                      <textFieldExpression><![CDATA[$F{subItem}]]></textFieldExpression>
                  </textField>
              </jr:listContents>
              <reportElement positionType="Float" stretchType="ContainerHeight" x="0" y="20" width="500" height="20" uuid="a1b2c3d4-e5f6-7890-abcd-1234567890ad"/>
          </jr:list>
          <!-- 第二个文本框 -->
          <textField textAdjust="StretchHeight">
             <reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="40" width="310" height="20" uuid="fb38a2e3-f141-472b-9fe0-fd1b998eb611"/>
             <textFieldExpression><![CDATA[$F{elementTwo}]]></textFieldExpression>
          </textField>
       </frame>
    </jr:listContents>
</jr:list>

关键说明

  • 父frame的stretchType="ContainerHeight"是核心,确保容器能容纳所有拉伸后的元素
  • 所有动态位置的元素(子列表、第二个文本框)必须设置positionType="Float",使其能自动跟随前面元素的高度调整位置
  • 文本框和子列表内部元素设置textAdjust="StretchHeight"和stretchType="ContainerHeight"/RelativeToTallestObject,保证内容能根据文本长度或子列表数量动态扩展

内容的提问来源于stack exchange,提问作者OhJohnny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:26:00