前段时间,因为工作需要,花了一天多时间来学习JFreeChart画折线图。因为网上的资料大部分只是一个简单的例子,并没有相对系统的分析,所以在代码的编写时,遇到了不少的困难。现在在其总结一下,作为笔记。
我的编程环境是eclipse3.20+Orcal10g,使用的框架是struts1.2,写log使用的是log4j。
首先,我们必须引入开发所使用的包。网上的介绍都说大部分需要3个包。jcommon-1.0.14.jar和jfreechart-1.0.11.jar,还有另外一个包,可是我在操作中发现,引入上述3个包,我的tomcat在启动时总会出错,与现有的程序包有冲突。后来在同事的帮助下,才发现只要上述前两个包就可以了。将这两个包放入tomcat的lib中,并增加这两个包的环境变量。
修改web.xml,增加相应的servlet。
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<!-- Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
接下来,我们便可以编写程序了。我的需求是在后台处理完数据后,生成时间金额的一个统计图,然后在web页中显示图片。
JFreeChart可以产生不同类型的统计图,如饼图,折线图,曲线图,柱状图等。它很好的使用了工厂模式,所有这些类型的图都需要相应在工厂ChartFactory中生成出相应的chart对象。而我需要的是下面这个函数
createTimeSeriesChart(java.lang.String title, java.lang.String timeAxisLabel, java.lang.String valueAxisLabel, XYDataset dataset, boolean legend, boolean tooltips, boolean urls)
dateset存储了要在图中显示的数据,它是一个数据集合,在折线图中它是所有折线的集合。
TimeSeriesCollection dataset = new TimeSeriesCollection(); // 建立dataset对象
dataset.removeAllSeries();// 删除原来的数据
TimeSeries aLine = new TimeSeries();// 建立一条折线的数据
TimeSeries bLine = new TimeSeries();
// 填充每条折线的数据,略。。。。
dataset.addSeries(aLine);
dataset.addSeries(bLine);
至此为止,一个dataset就造好了。
当然,创建JFreeChart对象还有另外一种方法,使用JFreeChart的构造函数,如
public JFreeChart(java.lang.String title,
java.awt.Font titleFont,
Plot plot,
boolean createLegend)
这里需要进行说明的是参数plot,它存储了图形的相关信息,对应于不同类型的图形,它有不同的子类。画折线图可以使用CatigoryPlot类。构造函数如下
CategoryPlot(CategoryDataset dataset, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryItemRenderer renderer)
上面这两种方式并没有太大的差别,工厂产生的对象已经根据图的类型把相应的参数设置好了,得到对象之后还可以对参数进行修正,不过所做的操作的要少一点。而后面的一种建立方式则要更繁琐一些。
将图形绘制出来,绘制出来的图形存放在session中,通过url进行引用。
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
fileName = ServletUtilities.saveChartAsJPEG(chart, width, height, info, session); //得到图片的URL
map = ChartUtilities.getImageMap("map", info, new StandardToolTipTagFragmentGenerator(),
new StandardURLTagFragmentGenerator());//得到这个图片上的map值
在客户端的jsp页面中,需要做的就是引用图片的URL,另外将map值传到前台。
<%
String graphURL = request.getContextPath()+"/servlet/DisplayChart?filename=" + filename;
%>
<bean:write name="projectCostDetailForm" property="map" filter="false"/>
<img src="<%= graphURL %>" border="0" usemap="#map"/>
上面的filter属性是必不可少的,不然数据就不是写入源source中,而是写入页面了。
这样,整个流程就完成了。
下面对各个包下面的类作一下简短的介绍。
包:org.jfree.chart 这个包下面的类都基本与图形本身有关
类:ChartColor 定义了一些图中使用的颜色
ChartFactory 能够产生各种图形的chart的对象
ChartFrame 在java程序中显示图片用的。
ChartMouseEvent 对图片进行鼠标操作的事件
ChartPanel 显示图片的面板,可以对各种事件作出响应
ChartRenderingInfo JFreeChart.draw() 方法执行时,存储显示信息
ChartUtilities 一个方法的集合,将chart转化为图片以及图片中的map的信息。
JFreeChart 做图类。