JasperReports Ultimate Guide - Sample Reference - Schema Reference - Configuration Reference - API (Javadoc)
JasperReports - jCharts Component Sample (version 5.6.0) |

Shows how jCharts components can be included in reports.
Download All Sample Source Files
Browse Sample Source Files on SVN

Main Features in This Sample
| Implementing Custom Components to Embed Third Party Visualisation Tools (jCharts Library)

top
| Implementing Custom Components to Embed Third Party Visualisation Tools (jCharts Library) | Documented by Sanda Zaharia
| Description / Goal |  | How to implement a custom component to wrap charts rendered by the jCharts library.
| Since |  | 3.1.0
| Other Samples |  |
/demo/samples/openflashchart
| The JCharts Component - Overview This sample contains an axis chart component implementation based on the jCharts library, that illustrates how charts generated with 3-rd party APIs can be embedded in reports generated with the JasperReports library. To make such an integration possible, the chart component provides its specific XSD schema in the `src/jcharts/charts.xsd` file. On the API side, the chart component is represented by the jcharts.AxisChartComponent class, which exposes the members declared in schema. When the report is filled, a JRImageRenderer instance is created in order to generate a chart image to be included into the report. The image representation of the chart was preferred instead of the chart itself because AxisChart objects fail on serialization. The JCharts Component - Schema Here is the JRXML schema for the axis chart component:
    <element name="axisChart" substitutionGroup="jr:component">
      <complexType>
        <complexContent>
          <extension base="jr:componentType">
            <sequence>
              <element ref="jc:axisDataset"/>
              <element name="legendLabelExpression">
                <complexType mixed="true"/>
              </element>
            </sequence>
            <attribute name="areaColor" type="string" use="required"/>
            <attribute name="evaluationTime" type="jr:basicEvaluationTime" use="optional" default="Now"/>
            <attribute name="evaluationGroup" type="string" use="optional"/>
          </extension>
        </complexContent>
      </complexType>
    </element>

    <element name="axisDataset">
      <complexType>
        <sequence>
          <element ref="jr:dataset" minOccurs="0" maxOccurs="1"/>
          <element name="labelExpression">
            <complexType mixed="true"/>
          </element>
          <element name="valueExpression">
            <complexType mixed="true"/>
          </element>
        </sequence>
      </complexType>
    </element>
A well defined axis chart configuration contains: an `axisDataset` - the area chart dataset characterized by the `dataset`, `labelExpression` and `valueExpression`. a `legendLabelExpression` - the expression used to set labels in the chart legend. and provide the following attributes: `areaColor` - the color of the area. Allowed values are either the color hexadecimal RGB notation, or color names preset in the ColorEnum. `evaluationTime` and `evaluationTime` with the same meaning as for built-in report elements. Embedding The JCharts Component The `src/jasperreports_extension.properties` file contains the following entries: `net.sf.jasperreports.extension.registry.factory.charts=net.sf.jasperreports.extensions.SpringExtensionsRegistryFactory` `net.sf.jasperreports.extension.charts.spring.beans.resource=jcharts/chart_beans.xml` Hence this component will be registered as Spring-based extension, in accordance with beans in the `src/jcharts/chart_beans.xml`:
    <bean id="componentsBundle" class="net.sf.jasperreports.engine.component.DefaultComponentsBundle">
      <property name="xmlParser">
        <ref local="xmlParser"/>
      </property>
      <property name="componentManagers">
        <map>
          <entry key="axisChart">
            <ref local="axisChartManager"/>
          </entry>
        </map>
      </property>
    </bean>

    <bean id="xmlParser" class="net.sf.jasperreports.engine.component.DefaultComponentXmlParser">
      <property name="namespace">
        <value>http://jasperreports.sourceforge.net/jasperreports/jcharts</value>
      </property>
      <property name="publicSchemaLocation">
        <value>http://jasperreports.sourceforge.net/dtds/charts.xsd</value>
      </property>
      <property name="internalSchemaResource">
        <value>jcharts/charts.xsd</value>
      </property>
      <property name="digesterConfigurer">
        <bean class="jcharts.ChartsDigester"/>
      </property>
    </bean>

    <bean id="axisChartManager" class="net.sf.jasperreports.engine.component.DefaultComponentManager">
      <property name="componentCompiler">
        <bean class="jcharts.AxisChartCompiler"/>
      </property>
      <property name="componentXmlWriter">
        <bean class="jcharts.AxisChartXmlWriter"/>
      </property>
      <property name="componentFillFactory">
        <bean class="jcharts.AxisChartFillFactory"/>
      </property>
    </bean>
The `src/jcharts` directory contains all necessary implementation APIs for this component: `AxisChartCompiler.java` - the compiler class for the axis chart component `AxisChartComponent.java` - the axis chart component `AxisChartFillFactory.java` - the fill factory class for the component `AxisChartXmlFactory.java` - the XML factory class for the component `AxisChartXmlWriter.java`- the component XML writer `AxisDataset.java` - the axis dataset element `AxisDatasetXmlFactory.java` - the XML factory class for the axis dataset `ChartsDigester.java` - the specific Digester class for the axis chart component `CompiledAxisDataset.java` - the compiled axis dataset class `DesignAxisDataset.java` - the design axis dataset object `FillAxisChart.java` - the fill object related to the axis chart `FillAxisDataset.java` - the fill object related to the axis dataset The JCharts Component - Sample An example of how to use the axis chart component is illustrated in the `reports/AxisChart.jrxml` template:
    <variable name="Value" class="java.lang.Double">
      <variableExpression>
        new Double(Math.pow($V{REPORT_COUNT}.doubleValue(), 4 - Math.log($V{REPORT_COUNT}.doubleValue())))
      </variableExpression>
    </variable>

    ...

    <componentElement>
      <reportElement x="0" y="70" width="500" height="300"/>
      <jc:axisChart xmlns:jc="http://jasperreports.sourceforge.net/jasperreports/jcharts"
          evaluationTime="Report" areaColor="cyan">
        <jc:axisDataset>
          <dataset/>
          <jc:labelExpression>$V{REPORT_COUNT}.toString()</jc:labelExpression>
          <jc:valueExpression>$V{Value}</jc:valueExpression>
        </jc:axisDataset>
        <jc:legendLabelExpression>"Data"</jc:legendLabelExpression>
      </jc:axisChart>
    </componentElement>
The report is filled using an empty data source with 12 records, as shown in `src/JChartsApp.java`:
    public void fill() throws JRException
    {
      long start = System.currentTimeMillis();
      JasperFillManager.fillReportToFile("build/reports/AxisChart.jasper", null, new JREmptyDataSource(12));
      System.err.println("Filling time : " + (System.currentTimeMillis() - start));
    }
The output in this case will be an area chart with 12 integer values on the x-axis. The related y-values are calculated in the `$V{Value}` variable expression. The output area color is cyan and the legend will be labeled `"Data"`. Running the Sample Running the sample requires the Apache Ant library. Make sure that `ant` is already installed on your system (version 1.5 or later). In a command prompt/terminal window set the current folder to `demo/samples/jchartscomponent` within the JasperReports source project and run the `> ant test view` command. It will generate all supported document types containing the sample report in the `demo/samples/jchartscomponent/build/reports` directory. Then the report will open in the JasperReports internal viewer.

© 2001- Jaspersoft Corporation www.jaspersoft.com