jfreechart 实现时间曲线图

jopen 10年前

jfreechart 实现时间曲线图


一、JFreeChart获取。


JFreeChart是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:


1、JFreeReport:报表解决工具 
2、JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp) 
3、JCommon:JFreeReport和JFreeChart的公共类库 
4、JFreeDesigner:JFreeReport的报表设计工具 

我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),下载地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍) 
我们以当前最新版本:jfreechart_0.9.21.zip为例子进行说明。 

二、JFreeChart配置安装


1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar 是例子程序(该部分留给大家自己去研究)

2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、lib\gnujaxp.jar。


3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入,如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明。


把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码:

<servlet> 
<servlet-name>DisplayChart</servlet-name> 
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>DisplayChart</servlet-name> 
<url-pattern>/servlet/DisplayChart</url-pattern> 
</servlet-mapping>

 
至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。

如果是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。 

三、Demo


 

<%@ page contentType="text/html;charset=GBK"%> 
<%@ 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"%> 
<%@ page import = "java.sql.*"%> 
<% 
//连接数据库 
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jfree"; 
String usr="sa"; 
String pwd=""; 
Connection conn=DriverManager.getConnection(url,usr,pwd); 
Statement stmt=conn.createStatement(); 
String sql="select * from jfree order by id"; 
ResultSet rs=stmt.executeQuery(sql); 

//设置曲线,共三条曲线 
TimeSeries timeseries = new TimeSeries("平均",Minute.class);//时间的最小单位为分,线值名是“平均”
TimeSeries timeseries1 = new TimeSeries("usl",Minute.class); 
TimeSeries timeseries2 = new TimeSeries("lsl",Minute.class); 

//从数据库中取值,数据和时间 
while(rs.next()) 

float y0=rs.getFloat("lengthavg"); 
float y1=rs.getFloat("lengthusl"); 
float y2=rs.getFloat("lengthlsl"); 
String s=rs.getString("addtime"); 
//从yyyyMMddHHmm时间格式的char中取出年月日小时分设为int值 
int x=Integer.parseInt(s.substring(0,4)); 
int y=Integer.parseInt(s.substring(4,6)); 
int z=Integer.parseInt(s.substring(6,8)); 
int a=Integer.parseInt(s.substring(8,10)); 
int b=Integer.parseInt(s.substring(10,12)); 

timeseries.add(new Minute(b,new Hour(a,new Day(z,y,x))),y0); 
timeseries1.add(new Minute(b,new Hour(a,new Day(z,y,x))),y1); 
timeseries2.add(new Minute(b,new Hour(a,new Day(z,y,x))),y2); 



//连接曲线 
TimeSeriesCollection dataset = new TimeSeriesCollection(); 
dataset.addSeries(timeseries); 
dataset.addSeries(timeseries1); 
dataset.addSeries(timeseries2); 
dataset.setDomainIsPointsInTime(true); 

//设置曲线图 
XYDataset xydataset = (XYDataset) dataset; 
JFreeChart chart = ChartFactory.createTimeSeriesChart( 
"走势图", 
"时间", 
"值", 
xydataset, 
true, 
true, 
true 
); 
chart.setBackgroundPaint(Color.white);//设置曲线图背景色 

XYPlot plot = (XYPlot) chart.getPlot(); 
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轴的距离,即曲线与xy轴贴近的距离 
xylineandshaperenderer.setBaseShapesVisible(true);//设置曲线是否显示数据点 

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); 
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; 
%> 
<img src="../../<%= graphURL %>" border=0 usemap="#<%= filename %>"> 



另外说一下,以前看到有很多人都说不能显示图,出来一个叉,一般那都是设置的servlet的错,我看到有的人就是用设置为servlets的 
所以就要在

String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;

中改为

String graphURL = request.getContextPath() + "/servlets /DisplayChart?filename=" + filename;

这个都要具体对待,出来叉的话有一点是肯定的,程序代码中没有程序错误,只是路径错误而已 

注意:有些类没有的话,可能是版本更换的问题,可以去源码或者API中找找看,有可能是换了位置,也可能是换了名字。