2014-09-22 2 views
0

Я тестирую Chart Theme с сообщением Джаспера. Почему я получаю IndexOutOfBoundsException, когда использую тему eye.candy.sixties? Другие темы в порядке (например: эгейской, по умолчанию, ....)Почему Jasper Chart Theme throw java.lang.IndexOutOfBoundsException: Индекс: 7, Размер: 7?

BarChartTest.java

public class BarChartTest { 
    @SuppressWarnings("unchecked") 
    public static void main(String[] args) { 
     String templateFile = "resources/bar.jrxml"; 

     DataBeanList dataBeanList = new DataBeanList(); 
     ArrayList<DataBean> dataList = dataBeanList.getDataBeanList(); 
     JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList); 
     Map parameters = new HashMap(); 

     try { 
      JasperDesign design = JRXmlLoader.load(templateFile); 
      JasperReport report = JasperCompileManager.compileReport(design); 
      JasperPrint print = JasperFillManager.fillReport(report, parameters, beanColDataSource); 
      JasperExportManager.exportReportToPdfFile(print, "D:/temp/bar_chart.pdf"); 
     } catch (JRException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

bar.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="jasper_report_template" pageWidth="595" pageHeight="860" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="50" bottomMargin="50" uuid="843cea12-1b23-4ff8-ae94-48b1850662ef"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <field name="subjectName" class="java.lang.String"/> 
    <field name="marks" class="java.lang.Integer"/> 
    <variable name="countNumber" class="java.lang.Integer" calculation="Count"> 
     <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression> 
    </variable> 
    <background> 
     <band splitType="Stretch"/> 
    </background> 
    <title> 
     <band height="35" splitType="Stretch"/> 
    </title> 
    <pageHeader> 
     <band height="200"> 
      <barChart> 
       <chart evaluationTime="Report" theme="eye.candy.sixties"> 
        <reportElement uuid="5133611e-49a1-4e9a-b4e5-8eff4e29c61b" x="0" y="0" width="515" height="200"/> 
        <box> 
         <pen lineWidth="1.0"/> 
         <topPen lineWidth="1.0"/> 
         <leftPen lineWidth="1.0"/> 
         <bottomPen lineWidth="1.0"/> 
         <rightPen lineWidth="1.0"/> 
        </box> 
        <chartTitle position="Top"> 
         <titleExpression><![CDATA["My First JR Bar Chart"]]></titleExpression> 
        </chartTitle> 
        <chartSubtitle/> 
        <chartLegend/> 
       </chart> 
       <categoryDataset> 
        <categorySeries> 
         <seriesExpression><![CDATA[$F{subjectName}]]></seriesExpression> 
         <categoryExpression><![CDATA[$F{subjectName}]]></categoryExpression> 
         <valueExpression><![CDATA[$F{marks}]]></valueExpression> 
        </categorySeries> 
       </categoryDataset> 
       <barPlot isShowTickMarks="false"> 
        <plot/> 
        <itemLabel/> 
        <categoryAxisFormat> 
         <axisFormat/> 
        </categoryAxisFormat> 
        <valueAxisFormat> 
         <axisFormat/> 
        </valueAxisFormat> 
       </barPlot> 
      </barChart> 
     </band> 
    </pageHeader> 
</jasperReport> 

StackTrace

WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components 
Sep 22, 2014 5:47:16 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles 
WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components 
Sep 22, 2014 5:47:16 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles 
WARNING: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components 
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7 
    at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
    at java.util.ArrayList.get(ArrayList.java:322) 
    at net.sf.jasperreports.chartthemes.spring.EyeCandySixtiesChartTheme.createBarChart(EyeCandySixtiesChartTheme.java:296) 
    at net.sf.jasperreports.chartthemes.spring.GenericChartTheme.createChart(GenericChartTheme.java:266) 
    at net.sf.jasperreports.engine.fill.JRFillChart.evaluateChart(JRFillChart.java:844) 
    at net.sf.jasperreports.engine.fill.JRFillChart.evaluateRenderer(JRFillChart.java:809) 
    at net.sf.jasperreports.engine.fill.JRFillChart.resolveElement(JRFillChart.java:1385) 
    at net.sf.jasperreports.engine.fill.JRFillElement.performDelayedEvaluation(JRFillElement.java:983) 
    at net.sf.jasperreports.engine.fill.JRFillElement.resolveElement(JRFillElement.java:1085) 
    at net.sf.jasperreports.engine.fill.ElementEvaluationAction.execute(JRBaseFiller.java:2486) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.resolveBoundElements(JRBaseFiller.java:1646) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.resolveReportBoundElements(JRBaseFiller.java:1673) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummary(JRVerticalFiller.java:1087) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:329) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:159) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:892) 
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:114) 
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) 
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) 
    at com.mutu.chart.test.BarChartTest.main(BarChartTest.java:34) 

Lib

jasperreports-chart-themes-4.0.2.jar 
jasperreports-5.6.1.jar 
jasperreports-applet-5.6.1.jar 
jasperreports-fonts-5.6.1.jar 
jasperreports-javaflow-5.6.1.jar 
...other necessary jar files 

ответ

0

Я нашел то, почему мы получаем IndexOutOfBoundsException, когда используем тему eye.candy.sixties.

Как моя проблема Problem 1Problem 2

Существует следующая переменная и метод jasperreports-chart-themes-xxx.jar. Основная проблема, EYE_CANDY_SIXTIES_GRADIENT_PAINTS размер списка - семь.

В ChartThemesConstants.java

@SuppressWarnings("serial") 
public static final List<GradientPaint> EYE_CANDY_SIXTIES_GRADIENT_PAINTS = new ArrayList<GradientPaint>() { 
    { 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(0), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(0)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(1), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(1)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(2), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(2)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(3), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(3)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(4), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(4)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(5), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(5)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(6), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(6)).darker())); 
    } 
}; 

В EyeCandySixtiesChartTheme.java

protected JFreeChart createBarChart() throws JRException { 
    JFreeChart jfreeChart = super.createBarChart(); 

    CategoryPlot categoryPlot = (CategoryPlot) jfreeChart.getPlot(); 
    // categoryPlot.setOrientation(PlotOrientation.HORIZONTAL); 
    BarRenderer barRenderer = (BarRenderer) categoryPlot.getRenderer(); 
    barRenderer.setItemMargin(0); 
    barRenderer.setGradientPaintTransformer(new StandardGradientPaintTransformer(GradientPaintTransformType.HORIZONTAL)); 
    CategoryDataset categoryDataset = categoryPlot.getDataset(); 
    if (categoryDataset != null) { 
     for (int i = 0; i < categoryDataset.getRowCount(); i++) { 
      barRenderer.setSeriesPaint(i, ChartThemesConstants.EYE_CANDY_SIXTIES_GRADIENT_PAINTS.get(i)); <-- Here is point 
     } 
    } 
    return jfreeChart; 
} 

Когда мы используем categoryDataset (ряды данных оси Х) с размером 8 и выше, мы получим IndexOutOfBoundsException. В моем проекте x-axis data series может быть более 10 и выше. Решение состоит в том, чтобы перезаписать ChartThemesConstants.java и создать новый файл jar снова. Я переписываю, как показано ниже, и заново создаю новый jar. Теперь x-axis data series может использовать 20 данных.

переписывают ChartThemesConstants.java

.... 
@SuppressWarnings("serial") 
public static final List<Color> EYE_CANDY_SIXTIES_COLORS = new ArrayList<Color>() { 
    { 
     add(new Color(250, 97, 18)); 
     add(new Color(237, 38, 42)); 
     add(new Color(0, 111, 60)); 
     add(new Color(250, 223, 18)); 
     add(new Color(47, 137, 187)); 
     add(new Color(231, 133, 35)); 
     add(new Color(229, 1, 140)); 
     add(new Color(234, 171, 53)); 
     add(Color.decode("#F5F5DC")); 
     add(Color.decode("#8B008B")); 
     add(Color.decode("#556B2F")); 
     add(Color.decode("#483D8B")); 
     add(Color.decode("#ADFF2F")); 
     add(Color.decode("#191970")); 
     add(Color.decode("#9457EB")); 
     add(Color.decode("#1A1110")); 
     add(Color.decode("#F984E5")); 
     add(Color.decode("#536878")); 
     add(Color.decode("#32127A")); 
     add(Color.decode("#80461B")); 
    } 
}; 

@SuppressWarnings("serial") 
public static final List<GradientPaint> EYE_CANDY_SIXTIES_GRADIENT_PAINTS = new ArrayList<GradientPaint>() { 
    { 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(0), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(0)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(1), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(1)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(2), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(2)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(3), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(3)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(4), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(4)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(5), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(5)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(6), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(6)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(7), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(7)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(8), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(8)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(9), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(9)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(10), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(10)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(11), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(11)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(12), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(12)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(13), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(13)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(14), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(14)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(15), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(15)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(16), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(16)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(17), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(17)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(18), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(18)).darker())); 
     add(new GradientPaint(0f, 0f, EYE_CANDY_SIXTIES_COLORS.get(19), 0f, 0f, (EYE_CANDY_SIXTIES_COLORS.get(19)).darker())); 
    } 
}; 
...