《利用jfreechar制作报表》由会员分享,可在线阅读,更多相关《利用jfreechar制作报表(25页珍藏版)》请在金锄头文库上搜索。
1、使用 JFreeChart 来创建基于 web 的图表WWW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在 web 浏览器上显示要求用户界面使用 HTML 以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目的客户端,因此在这里也变得无能为力。回到本文的题目上来,为了创建一个可以在 web 浏览器上查看到图表一般有两种做法:第一种就是使用 applet 利用
2、 java 本身对图形的支持来显示一个图表;第二种就是直接在 web 服务器端生成好图表图片文件后发送给浏览器。第一种方式显然对于客户端要求太高,随着现在主流浏览器放弃对 JAVA 的支持后,这种方式只适合一些局域网的应用,而对于因特网的环境就显得不太适合。因此我们下面将介绍一个 JAVA 的图表引擎 JFreeChart 用来产生基于 WEB 的图表。一、JFreeChart 项目简介JFreeChart 是开放源代码站点 SourceF 上的一个 JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表
3、盘等等。这些不同式样的图表基本上可以满足目前的要求。为了减少篇幅本文主要介绍前面三种类型的图表,读者可以触类旁通去开发其他样式的图表。下面几个是 JFreeChart 产生的这三种类型图表的结果: 图 1 图 2 图 3上面的三个图都是表示四个季度的某个产品的销量信息。在继续下面小节之前必须先准备好开发环境,因为是基于 WEB 浏览器的图表展现,因此需要一个 Servlet 引擎或者是 J2EE 应用服务器(例如WebSphere,Tomcat 等)。WEB 环境的搭建就不累赘了,读者根据喜好自行安装。JFreeChart 引擎本身需要到 SourceF 上下载,地址如下: JFreeChar
4、t 主页:http:/www.jfree.org/jfreechart/index.htmlJFreeChart 下载页面:http:/ 以及Jcommon。目前最新配套版本是:JFreeChart 0.9.11 Jcommon 0.8.6 这里有点笔者在开发中遇见的问题需要注意的是:在使用Eclipse 开发的时候会报一个莫名其妙的错误,错误可能指向某个类文件的第一行。遇到这样的问题一般是因为没有把 Jcommon 的 jar 包设置到项目的类路径中的缘故。具体的原因不祥。 (还有 log4j 等也咬一起导入)。二、解读 JFreeChart 的源码结构在开始使用 JFreeChart 之前
5、我们有必要先大概了解一下JFreeChart 本身的结构以及它所带一些例子程序,这样有助于我们下一步自行开发。下载 JFreeChart 包后已经带有非常丰富的例子,因为JFreeChart 这个项目本身的使用文档非常少,因此学习它最好的办法就是学习它所带的例子源码。在包 org.jfree.chart.demo 中有几十个文件用于展示 JFreeChart 所能支持的所有图表的结果。如果你的 JDK是比较新的情况下可能在运行这些例子时会有问题,现象如下: java.lang.UnsatisfiedLinkError: initDDrawat sun.awt.windows.Win32OffS
6、creenSurfaceData.initDDraw(Native Method)at sun.awt.windows.Win32OffScreenSurfaceData.(Win32OffScreenSurfaceData.java:141)at sun.awt.Win32GraphicsDevice.(Win32GraphicsDevice.java:58)at sun.awt.Win32GraphicsEnvironment.makeScreenDevice(Win32GraphicsEnvironment.java:168)at sun.java2d.SunGraphicsEnviro
7、nment.getScreenDevices(SunGraphicsEnvironment.java:240)at sun.awt.Win32GraphicsEnvironment.getDefaultScreenDevice(Win32GraphicsEnvironment.java:61)at java.awt.Window.init(Window.java:224)at java.awt.Window.(Window.java:268)at java.awt.Frame.(Frame.java:398)at javax.swing.JFrame.(JFrame.java:198)at o
8、rg.jfree.chart.demo.JFreeChartDemo.(JFreeChartDemo.java:148)at org.jfree.chart.demo.JFreeChartDemo.main(JFreeChartDemo.java:285)Exception in thread main 这个错误是由于新版的 Swing 大量的使用了微软的 DirectDraw 的技术来提高画图的性能,而可能你的显卡在这时候会跟你闹点情绪或者显卡本身并不支持这样的一个技术。难道就没有办法了嘛?要解决这个问题也非常简单,我们可以屏蔽掉 DirectDraw,不让 Swing 使用该技术就可以了。
9、在运行这些代码时给虚拟机指定参数-Dsun.java2d.noddraw 即可。 这时可能你又该纳闷了,不说是基于 Web 的图表嘛,怎么又扯到Swing 上了?这是因为为了使开发者容易上手,无需配置任何运行环境,所以这些例子都是基于 GUI 方式的用于展现给开发者如果生成一个图表,我们要学习的也就是如何利用这个引擎生成图表而不是怎么来显示一个图表。当我们把生成的图表对象 Export 到一个图像文件即可在 Web 上发布。 下面我们来介绍 JFreeChart 中几个核心的对象类:类名类的作用以及简单描述JFreeChart图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制
10、。JFreeChart 引擎本身提供了一个工厂类用于创建不同类型的图表对象XXXXXDataset数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类XXXXXPlot 图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要 Axis、Renderer 以及数据集对象的支持XXXXXAxis 用于处理图表的两个轴:纵轴和横轴XXXXXRenderer负责如何显示一个图表对象XXXXXURLGenerator 用于生成 Web 图表中每个项目的鼠标点击链接XXXXXToolTipGenerator 用于生成图象的帮助提示,不同类型图表对应不同类型
11、的工具提示类基本上我认为 JFreeChart 项目本身的类结构的设计并不是很好,首先在创建图表的时候用到了大量的工厂方法,这样做虽然可以简化创建图表对象的代码,但是对项目本身或者开发人员来讲自行扩展一种新的图表都仍然是一件很麻烦的事情;其次除图表对象本身外其余的类过于复杂,使用者必须去了解每个类型的图表对象应该对应哪些Axis、Plot、Renderer 类,并且必须非常熟悉这些类的构造函数中每个参数的具体含义。这些问题都大大困扰很多初学者。不过,虽然存在很多问题,但是 JFreeChart 本身仍不失为一个非常优秀的图表引擎,况且项目本身也在逐渐的发展中。 在非常简略的介绍了 JFreeC
12、hart 本身的代码结构后,下面我们开始动手试验几个常用的图表并把他们放到 web 上。三、使用 JFreeChart 生成各种样式的图表限于篇幅的问题我们在这里只实现两种常用的图表,其他类型图表读者可以触类旁通。我们先给出柱状图的实现,饼图的实现再来跟柱状图进行比较。 1 柱状图codepackage lius.chart.demo;import java.io.*;import org.jfree.data.*;import org.jfree.chart.*;import org.jfree.chart.plot.*;/* 该类用于演示最简单的柱状图生成* author Winter L
13、au */public class BarChartDemo public static void main(String args) throws IOExceptionCategoryDataset dataset = getDataSet2();JFreeChart chart = ChartFactory.createBarChart3D(水果产量图, / 图表标题水果, / 目录轴的显示标签产量, / 数值轴的显示标签dataset, / 数据集PlotOrientation.VERTICAL, / 图表方向:水平、垂直true, / 是否显示图例(对于简单的柱状图必须是 false
14、)false, / 是否生成工具false / 是否生成 URL 链接);FileOutputStream fos_jpg = null;try fos_jpg = new FileOutputStream(D:fruit.jpg);ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); finally try fos_jpg.close(); catch (Exception e) /* 获取一个演示用的简单数据集对象* return*/private static CategoryDataset getDataSet
15、() DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addvalue(100, null, 苹果);dataset.addvalue(200, null, 梨子);dataset.addvalue(300, null, 葡萄);dataset.addvalue(400, null, 香蕉);dataset.addvalue(500, null, 荔枝);return dataset;/* 获取一个演示用的组合数据集对象 * return*/private static CategoryDataset getDataSet2() DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addvalue(100, 北京, 苹果);dataset.addvalue(100, 上海, 苹果);dataset.addvalue(100, 广州, 苹果);dataset.addvalue(200, 北京, 梨子);dataset.addvalue(200, 上海, 梨子);dataset.addvalue(200, 广州, 梨子);dataset.addvalu