要实现一个通过查询数据库中值来使用JFreeChart画图的功能。代码如下 
代码
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" %>    
<jsp:useBean id="DBconnect" scope="page" class="erm.DBcon" />  
<%@ page import =" java.awt.*,   
java.text.SimpleDateFormat,   
javax.swing.JPanel,   
org.jfree.chart.ChartFactory,   
org.jfree.chart.ChartPanel,   
org.jfree.chart.JFreeChart,   
org.jfree.chart.axis.DateAxis,   
org.jfree.chart.plot.XYPlot,   
org.jfree.chart.renderer.xy.XYItemRenderer,   
org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,   
org.jfree.data.time.*,   
org.jfree.data.time.TimeSeries,   
org.jfree.data.time.TimeSeriesCollection,   
org.jfree.data.xy.XYDataset"%>  
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>  
<%@ page import="java.util.*"%>  
<%@ page import = "org.jfree.ui.RectangleInsets"%>  
  
<html>  
<head>  
<%!   
    ResultSet rs=null;   
%>  
</head>  
<body>  
<%   
  String sql="select * from cpdls";    
  rs=DBconnect.executeQuery(sql);   
  TimeSeries timeseries = new TimeSeries("最大值",Day.class);   
  TimeSeries timeseries1 = new TimeSeries("平均值",Day.class);   
  //从数据库中取值,数据和时间   
try{     
  while(rs.next())    
  {   
    String y0=rs.getString("MAX");   
    String y1=rs.getString("MEAN");   
    Float f0=Float.parseFloat(y0);   
    Float f1=Float.parseFloat(y1);   
    String s=rs.getString("DATETIME");   
  
    //从yyyyMMddHHmm时间格式的char中取出年月日设为int值    
    int x=Integer.parseInt(s.substring(0,4));   
    int y=Integer.parseInt(s.substring(5,7));   
    int z=Integer.parseInt(s.substring(8,10));   
    timeseries.add(new Day(z,y,x),f0);   
    timeseries1.add(new Day(z,y,x),f1);   
  
   }   
  }   
catch(Exception e){System.out.print("error");}   
  
//连接曲线   
TimeSeriesCollection dataset = new TimeSeriesCollection();   
dataset.addSeries(timeseries);   
dataset.addSeries(timeseries1);   
dataset.setDomainIsPointsInTime(true);   
  
//设置曲线图   
XYDataset xydataset = (XYDataset) dataset;   
JFreeChart chart = ChartFactory.createTimeSeriesChart("chart","time","value",xydataset,true,true,true);   
chart.setBackgroundPaint(Color.white);//设置曲线图背景色   
XYPlot plot = (XYPlot) chart.getPlot();   
DateAxis axis = (DateAxis) plot.getDomainAxis();   
axis.setDateFormatOverride(new SimpleDateFormat("dd-MMM-yyyy"));   
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();   
plot.setBackgroundPaint(Color.white);//设置网格背景颜色   
plot.setDomainGridlinePaint(Color.pink);//设置网格竖线颜色   
plot.setRangeGridlinePaint(Color.pink);//设置网格横线颜色   
plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));//设置曲线图与xy轴的距离   
plot.setDomainCrosshairVisible(true);   
plot.setRangeCrosshairVisible(true);   
  
xylineandshaperenderer.setBaseShapesVisible(true);//设置曲线是否显示数据点   
  
String filename = ServletUtilities.saveChartAsJPEG(chart, 500, 300, null, session);   
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;   
  
%>  
<img src="<%= graphURL %>" border=0 usemap="#<%= filename %>">  
  
</body>  
</html>  
  
但是当有 
timeseries.add(new Day(z,y,x),f0); 
timeseries1.add(new Day(z,y,x),f1); 
即程序中的47,48这两行代码的时候,就只能够输出数据库中的前两行数据,即只能画出两个点。 
当没有这两句时,有输出语句测试,就能输出数据,不知道是什么原因。

解决方案 »

  1.   

    你看一下你的临时目录里是不是有很多这个组件生成的临时图片文件?这个组件有bug的,不会自己删掉这些临时生成的图。
      

  2.   

    windows的临时目录下没有什么临时图片文件啊。
    如果有这两行代码的话:
    timeseries.add(new Day(z,y,x),f0); 
    timeseries1.add(new Day(z,y,x),f1);
    加入一个输出的测试语句也是只能输出两条数据,不能输出所有的
    只有把这两句去掉了才能显示所有的数据 
      

  3.   

    和临时图片没关系,肯定时间问题,
    dataset.addSeries(date,double)
    而且这个两个时间好象是一个嘛。
      

  4.   

    不明白啊
    应该是dataset.addSeries(TimeSeries series)吧。
    不知道您说的那两个时间是一样的啊?