Saturday, 8 August 2015

Jasper Report Chart Customizer class


                                      Jasper Report Chart Customizer class


Jasper Report Chart Customizer class:-Chart customizer class are nothing but java classes that can be used to modify or change the appearance of your  jasper report chart.For ex: you can change style of your line from solid to dashed,change the color of line from black to yellow,white etc.

Here is the sample implementation of customizer class,I have used XY plot series graph where I have to display lines of different color and different style of line of each data.

For implementation you need to extend class JRAbstractChartCustomizer.This class contains customize method which accepts JFreeChart and JRChart as arguments.Inside customize method you can customize your graph according to the way you want.

 import java.awt.BasicStroke;  
 import java.awt.Color;  
 import java.awt.Shape;  
 import java.awt.Stroke;  
 import java.awt.geom.Ellipse2D;  
 import java.util.ArrayList;  
 import java.util.HashSet;  
 import java.util.List;  
 import java.util.Set;  
 import net.sf.jasperreports.engine.JRAbstractChartCustomizer;  
 import net.sf.jasperreports.engine.JRChart;  
 import org.jfree.chart.JFreeChart;  
 import org.jfree.chart.plot.XYPlot;  
 import org.jfree.chart.renderer.xy.XYItemRenderer;  
 import org.jfree.data.xy.XYDataset;  
 public class KPIChartCustomizer extends JRAbstractChartCustomizer {  
      // different styles of line strokes  
      Stroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,  
                BasicStroke.JOIN_MITER, 10.0f, new float[] { 10.0f }, 0.0f);  
      Stroke dotted = new BasicStroke(1f, BasicStroke.CAP_ROUND,  
                BasicStroke.JOIN_ROUND, 1f, new float[] { 2f }, 0f);  
      Stroke solid = new BasicStroke(1.7f);  
      Stroke medium = new BasicStroke(1f);  
      Stroke thin = new BasicStroke(0.4f);  
      Stroke solidDashedWithCapButt = new BasicStroke(1.5f, BasicStroke.CAP_BUTT,  
                BasicStroke.JOIN_MITER, 10.0f, new float[] { 10.0f }, 0.0f);  
      Stroke solidDashedWithCapSquare = new BasicStroke(1.5f,  
                BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10.0f,  
                new float[] { 10.0f }, 0.0f);  
      float[] dash2 = { 1f, 1f, 1f };  
      float[] dash4 = { 4f, 4f, 1f };  
      Stroke smallDots = new BasicStroke(1, BasicStroke.CAP_BUTT,  
                BasicStroke.JOIN_ROUND, 1.0f, dash2, 2f);  
      Stroke dashedAndDots = new BasicStroke(1, BasicStroke.CAP_BUTT,  
                BasicStroke.JOIN_ROUND, 1.0f, dash4, 2f);  
      Stroke[] basicStrokeArr = { solid, dashed, dotted, smallDots, medium,  
                dashedAndDots, thin };  
      @Override  
      public void customize(JFreeChart freeChart, JRChart jrChart) {  
           XYPlot plot = (XYPlot) freeChart.getPlot();  
           XYItemRenderer renderer = plot.getRenderer();  
           int seriesCount = plot.getSeriesCount();  
           XYDataset dataSet = plot.getDataset();  
           Set<String> nameStr = new HashSet<String>();  
           Set<String> reportTypeStr = new HashSet<String>();  
           boolean oneKpiAndMultipleAPFlag = false;  
           List<Color> listOfColors = new ArrayList<Color>();  
           String[] dnNames = new String[nameStr.size()];  
           nameStr.toArray(dnNames);  
           String[] reportTypes = new String[reportTypeStr.size()];  
           reportTypeStr.toArray(reportTypes);  
           for (int i = 0; i < seriesCount; i++) {  
                String name = (String) dataSet.getSeriesKey(i);  
                Color seriesColor = getColor(name, reportTypes);  
                renderer.setSeriesPaint(i, seriesColor);  
                Stroke lineStroke = getLineStroke(name, dnNames);  
                renderer.setSeriesStroke(i, lineStroke);  
                Shape shape = new Ellipse2D.Double(-0.75, -0.75, 2, 2);  
                renderer.setSeriesShape(i, shape);  
           }  
      }  
      /**  
       * return type of line stroke .  
       *   
       * @param name  
       * @param reportTypes  
       * @return  
       */  
      private Stroke getLineStroke(String name, String[] reportTypes) {  
           Stroke lineStroke = null;  
           if (name.contains(reportTypes[0])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[0];  
           } else if (name.contains(reportTypes[1])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[1];  
           } else if (name.contains(reportTypes[2])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[2];  
           } else if (name.contains(reportTypes[3])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[3];  
           } else if (name.contains(reportTypes[4])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[4];  
           } else if (name.contains(reportTypes[5])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[5];  
           } else if (name.contains(reportTypes[6])) {  
                // colour yellow  
                lineStroke = basicStrokeArr[6];  
           }  
           return lineStroke;  
      }  
      private Color getColor(String name, String[] dnNames) {  
           Color seriesColor = null;  
           if (name.contains(dnNames[0])) {  
                // colour blue  
                seriesColor = Color.BLUE;  
           } else if (name.contains(dnNames[1])) {  
                // colour Red  
                seriesColor = Color.RED;  
           } else if (name.contains(dnNames[2])) {  
                // colour green  
                seriesColor = Color.GREEN;  
           } else if (name.contains(dnNames[3])) {  
                // colour magenta  
                seriesColor = Color.MAGENTA;  
           } else if (name.contains(dnNames[4])) {  
                // colour black  
                seriesColor = Color.BLACK;  
           } else if (name.contains(dnNames[5])) {  
                // colour cyan  
                seriesColor = Color.CYAN;  
           } else if (name.contains(dnNames[6])) {  
                // colour light gray  
                seriesColor = Color.LIGHT_GRAY;  
           } else if (name.contains(dnNames[7])) {  
                // colour yellow  
                seriesColor = Color.YELLOW;  
           } else if (name.contains(dnNames[8])) {  
                // colour pink  
                seriesColor = Color.PINK;  
           }  
           return seriesColor;  
      }  
 }  

In order to use customizer class,You need to mention customizer class in your jrxml file also.

For example :

<summary>  
           <band height="443">  
                <timeSeriesChart>  
                     <chart isShowLegend="true" customizerClass="com.ipaccess.nos.business.pm.impl.KPIChartCustomizer">  
                          <reportElement mode="Opaque" x="0" y="0" width="766" height="443" isPrintInFirstWholeBand="true"/>  
                          <chartTitle position="Top">  
                               <font size="14" isBold="true" pdfFontName="Courier-Bold" isPdfEmbedded="true"/>  
                               <titleExpression><![CDATA[$P{REPORT_NAME}]]></titleExpression>  
                          </chartTitle>  
                          <chartSubtitle/>  
                          <chartLegend position="Bottom">  
                               <font size="8"/>  
                          </chartLegend>  
                     </chart>  
           </band>  
      </summary>  





Enjoy reading :)

No comments:

Post a Comment