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
相关产品推荐
相关产品推荐

