要实现一个通过查询数据库中值来使用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这两行代码的时候,就只能够输出数据库中的前两行数据,即只能画出两个点。
当没有这两句时,有输出语句测试,就能输出数据,不知道是什么原因。
代码
<%@ 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这两行代码的时候,就只能够输出数据库中的前两行数据,即只能画出两个点。
当没有这两句时,有输出语句测试,就能输出数据,不知道是什么原因。
如果有这两行代码的话:
timeseries.add(new Day(z,y,x),f0);
timeseries1.add(new Day(z,y,x),f1);
加入一个输出的测试语句也是只能输出两条数据,不能输出所有的
只有把这两句去掉了才能显示所有的数据
dataset.addSeries(date,double)
而且这个两个时间好象是一个嘛。
应该是dataset.addSeries(TimeSeries series)吧。
不知道您说的那两个时间是一样的啊?