精通JFreeChart统计图表的实现(一)

来源:互联网 发布:ps4配置 知乎 编辑:程序博客网 时间:2024/04/23 22:35

在图表统计功能中,利用开源项目JFreeChart在开发Web项目方面的简单易用的优势来实现的。下面是对JFreeChart的概念和实现机制的分析。最后给出一个图表统计应用实例。

1JFreeChart的概念

JFreeChart是一个免费的Java Chart Library,并且它能够被用在应用程序,AppletsServletsJsp中。它是完全源代码公开的,但是如果用到商业中会受到这个许可证书的限制。它是一个开源的图形报表引擎中间件,主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。

JFreeChart的开发环境,因为是基于WEB浏览器的图表展现,因此需要一个Servlet引擎或者是J2EE应用服务器(例如WebSphereTomcat等)。以及WEB环境的搭建。在开发时必须的两个文件包是:JFreeChart以及Jcommon。目前最新配套版本是:JFreeChart 0.9.20  Jcommon 0.9.4

2、用JFreeChart创建WEB图表的基本知识和实现机制

(1) JFreeChart主要是由三个类构成:

org.jfree.chart.servlet.ChartDeleter  //删除临时目录中的图像

org.jfree.chart.servlet.DisplayChart  //显示图像

org.jfree.chart.servlet.ServletUtilities//处理图像

下面是对以上各个类的详细说明:

ChartDeleter 继承自HttpSessionBindingListener,用于实现当Session 关闭时,删除临时目录中的图像文件。

ServletUtilities有一系列方法:

saveChartAs*;saveChartAs*是把图表按照不同的形式存储为图像;

sendTempFile方法被重载了很多次,用于把文件流发送response;

DisplayChart继承自Httpservlet 用于处理显示图像;

(2)在你的应用中 web.xml文件必须配置DisplayChart;

配置形式如:

DisplayChart

org.jfree.chart.servlet.DisplayChart

DisplayChart

/servlet/DisplayChart

3创建交互式WEB图表的实现机制

       很多情况不仅仅要求可以在浏览器上显示一个图表,更需要用户可以直接在图表上做一下交互的操作,例如获取信息提示,点击图表某个部分进行更详细信息的展示等等。为此就要求该图形具有交互操作的功能。在HTML中需要一个图像具有可交互的功能就必须给该图像定义一个Map对象。要根据一个图像来生成对应的MAP对象,则需要在创建一个图表的时候有两个参数,这两个参数就是ChartFactory.createBarChart3D方法中的最后两个参数,这两个参数的类型都是布尔值。它们意思分别是:是否创建工具提示(tooltip)以及是否生成URL。分别对应着MAP中一个AREAtitle属性以及href属性。

JFreeChart中要实现MAP对象的功能,就需要生成一个MAP对象。但是它需要引入另外一个对象:ChartRenderingInfo。但是在JFreeChart没有直接的方法来利用一个图表对象直接生成MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo

生成MAP数据的流程图如图1.1所示:

1. 1 MAP数据的流程图

如上图所示,ChartUtilities类是整个流程的核心,它周围的对象都是一些例如数据对象或者是文件等。这个流程简单描述如下:

首先创建一个ChartRenderingInfo对象并在调用ChartUtilitieswriteChartAsJPEG时作为最后一个参数传递进去。调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,有了这个对象还是没有办法获取具体的MAP数据,我们还必须借助于ChartUtilitieswriteImageMap方法来将ChartRenderingInfo对象读取出来。

获取MAP数据的代码片断如下:

              FileOutputStream fos_jpg = null;//定义一个文件输出流的对象fos_jpg

              FileOutputStream fos_cri = null; //定义一个文件输出流的对象fos_cri

              try{

                     //根据不同类型的图表使用不同的类,下面是对饼形图的操作

                     PiePlot plot = (PiePlot) chart.getPlot();//定义一个饼形图

                     plot.setURLGenerator(new StandardPieURLGenerator(url));

                     //设置URL属性

                 plot.setToolTipGenerator(new StandardPieToolTipGenerator());

//设置工具提示

                     fos_jpg = new FileOutputStream(“d://example.jpg”);

                     //实例化一个fos_jpg输出文件流的对象d://example.jpg

                     ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,info);

                     //保存fos_jpg文件

                     fos_cri = new FileOutputStream(“d:// example.map”);

                     //实例化一个fos_cri输出文件流的对象d://example.jpg

                     PrintWriter w = new PrintWriter(fos_cri);

                     //输出实例化的文件流对象

                     ChartUtilities.writeImageMap(w, mapname, info);

// 将图像的MAP写入PrintWriter对象w

                     w.flush();

           }