2013-04-05 62 views
0

在单个系列中,即时间系列图表中,必须获得不同的形状。但它没有来...请参考下面的代码,告诉我我犯了什么错误?形状在if和else if语句中没有变化Jfreechart

 TimeSeriesCollection dataset = new TimeSeriesCollection(glucoseries);             
     JFreeChart chart = ChartFactory.createTimeSeriesChart("Glucometer","Date","value",dataset,true,true,false);       

    XYPlot xyplot = (XYPlot)chart.getPlot(); 
    XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyplot.getRenderer(); 

    int glucovalue = Integer.parseInt(glcvalue); 

    if(glucovalue<80) 
    {  
    renderer.setSeriesShape(0,new Ellipse2D.Double(-3.0,-3.0,8.0,8.0)); 
    renderer.setSeriesShapesVisible(0,true); 
    } 
    else if(glucovalue>80 && glucovalue<100) 
    {    
    renderer.setSeriesShape(0,ShapeUtilities.createUpTriangle(4.0f)); 
    renderer.setSeriesShapesVisible(0,true);    
    } 
    else if(glucovalue>100 && glucovalue< 120) 
    {     
    renderer.setSeriesShape(0,ShapeUtilities.createDiamond(4.0f)); 
    renderer.setSeriesShapesVisible(0,true);      
    } 
    else 
    { 
    renderer.setSeriesShape(0,ShapeUtilities.createDownTriangle(4.0f)); 
    renderer.setSeriesShapesVisible(0,true);      
    } 

    ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 
    File file1 = new File(request.getRealPath("\\jspchart\\gluco7.png")); 
    ChartUtilities.saveChartAsPNG(file1, chart, 700, 400, info);  

enter image description here

+0

事情是你所示的代码生成suppled截图? – GrahamA 2013-04-05 15:29:47

+0

@GrahamA它没有生成...但我需要输出像上面的截图 – Ree 2013-04-06 04:18:11

回答

3

的逻辑在你的IF语句仅被评估一次,您需要继承XYLineAndShapeRenderer#getItemShape以基于当前值返回一个形状。这样

XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true){ 
     Shape ellipse = new Ellipse2D.Double(-3.0,-3.0,8.0,8.0); 
     Shape upTriangle = ShapeUtilities.createUpTriangle(4.0f); 
     Shape diamond = ShapeUtilities.createDiamond(4.0f); 
     Shape downTriangle = ShapeUtilities.createDownTriangle(4.0f); 


     @Override 
     public Shape getItemShape(int row, int column) { 
      Double value = (Double) plot.getDataset(0).getY(row, column); 
      if (value > 6.0) { 
       return ellipse; 
      } else if (value >= 5.0) { 
       return upTriangle; 
      } else if (value >= 2.0) { 
       return diamond; 
      }else { 
       return downTriangle; 
      } 
     } 

    }; 

    plot.setRenderer(renderer); 

enter image description here

+0

由于绘图对象位于方法getItemShape()内部,因此无法识别,并且在此时显示错误.... – Ree 2013-04-06 05:11:30

+0

将绘图标记为最终绘图。你在使用IDE吗? Eclipse会为您提供此修补程序。 – GrahamA 2013-04-06 06:33:17

+0

单个系列中的每个不同形状都必须用不同的颜色填充..我尝试使用renderer.setFillPaint()函数,但渲染器不适用...可以告诉我渲染器必须在何处完全应用? – Ree 2013-04-06 09:36:34

0

我无法弄清楚什么是价值:glucovalue

但你在这里漏掉一两件事:你有没有正确地考虑边界值。

对于如:

if(glucovalue<80) 
{  
renderer.setSeriesShape(0,new Ellipse2D.Double(-3.0,-3.0,8.0,8.0)); 
renderer.setSeriesShapesVisible(0,true); 
} 
else if(glucovalue>80 && glucovalue<100) 
{  

在上面的代码中,没有一例会,如果glucovalue = 80

更改代码如下搭配:

if(glucovalue<80) 
{  
renderer.setSeriesShape(0,new Ellipse2D.Double(-3.0,-3.0,8.0,8.0)); 
renderer.setSeriesShapesVisible(0,true); 
} 
else if(glucovalue>=80 && glucovalue<=100) 
{ 
+0

如果是这样会进入其他部分...但仍然形状没有变化 – Ree 2013-04-05 10:03:17

+0

如果你还有其他部分,那么它怎么可能没有什么是执行。你有什么异常吗? – 2013-04-05 11:17:12