如何访问 JasperDesign 对象的私有和受保护的 JRElements 成员?

How to access private and protected JRElements members of JasperDesign object?

我正在使用 JasperDesign class 创建 Jasper 对象,并使用 jrxml 文件中的 JRXmlLoader 启动它。 我正在使用 getAllBands() 方法提取所有 JRBand 以获取所有 JRBand,并且我正在使用 JRBand 的 getElements() 方法从每个波段中提取 JRElements。

但是,在获取 staticFieldtextField 等每个元素后,我无法从私有或受保护的 "TEXT" 字段中获取它们的值。

我如何访问这些值?

您需要将 JRElement 转换为相对 JRDesign class 才能访问元素的特定属性:

例子

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="testJasperDesign" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="597c0716-df6b-42ec-a7c8-863eb1b7174a">
    <parameter name="testParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["Hello world"]]></defaultValueExpression>
    </parameter>
    <variable name="variable1" class="java.lang.String"/>
    <title>
        <band height="32" splitType="Stretch">
            <textField>
                <reportElement x="100" y="0" width="100" height="20" uuid="bf5a8f35-3faf-457b-a6fc-b29d97a9c332"/>
                <textFieldExpression><![CDATA[$P{testParam}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="0" width="100" height="20" uuid="59922664-93a3-4f69-a906-5ff418d09cd3"/>
                <text><![CDATA[Static text]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

Java

public static void main(String[] args) throws JRException {

    JasperDesign design = JRXmlLoader.load("jasper/testJasperDesign.jrxml");
    JRBand titleBand = design.getTitle();
    JRElement[] elements = titleBand.getElements();
    for (JRElement element : elements) {
        if (element instanceof JRDesignTextField){
            JRDesignTextField textField = (JRDesignTextField) element;
            JRExpression expression = textField.getExpression();
            System.out.println(expression.getText());
        }
        if (element instanceof JRDesignStaticText){
            JRDesignStaticText staticText = (JRDesignStaticText) element;
            System.out.println(staticText.getText());
        }

    }
}

输出

$P{testParam}
Static text