JFreeChart中几个核心的对象类:
类名
类的作用以及简单描述
JFreeChart
图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
XXXXXDataset
数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类。常用的数据集对象有:柱状图数据集对象DefaultCategoryDataset、饼图数据集对象DefauldPieDataset和曲线图数据集对象DefaultTableXYDataset
XXXXXPlot
图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持。常用的Plot对象有:柱状图CategoryPlot、饼图PiePlot和曲线图XYPlot。
XXXXXAxis
用于处理图表的两个轴:纵轴和横轴。常用的有NumberAxis数据轴,DateAxis日期轴。
XXXXXRenderer
负责如何显示一个图表对象。常用的Renderer有DefaultCategoryItemRenderer 柱状图显示器StandardXYItemRenderer曲线图显示器。饼图的Renderer
XXXXXURLGenerator
用于生成Web图表中每个项目的鼠标点击链接。常用的URLCenerator有StandardCategoryURLGenerator
StandardPieURLGenerator
StandardXYURLGenerator
XXXXXToolTipGenerator
用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类。常用的有:StandardXYToolTipGenerator
StandardCategoryToolTipGenerator
StandardPieItemLabelGenerator
一般的创建图表的过程为:
1. 从数据库里读取数据
2. 将数据保存到图表对应的数据集对象中
3. 创建坐标轴对象
4. 创建Renderer对象
5. 创建Plot对象
6. 创建JfreeChart对象
7. 生成图片文件(或者二进制流)
以JfreeChart提供的Web应用的例子来说明一下以上几个步骤:
一.柱图。
public static String generateBarChart(Date hitDate, HttpSession session, PrintWriter pw) {
String filename = null;
try {
// Retrieve list of WebHits
WebHitDataSet whDataSet = new WebHitDataSet();
ArrayList list = whDataSet.getDataBySection(hitDate);//获得数据集
// Throw a custom NoDataException if there is no data
if (list.size() == 0) {
System.out.println("No data has been found");
throw new NoDataException();
}
// Create and populate a CategoryDataset
Iterator iter = list.listIterator();
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
while (iter.hasNext()) {
WebHit wh = (WebHit)iter.next();
dataset.addValue(new Long(wh.getHitCount()), "Hits", wh.getSection());
}//将数据集保存到Dataset对象
// Create the chart object
CategoryAxis categoryAxis = new CategoryAxis("");
ValueAxis valueAxis = new NumberAxis("");//创建坐标轴
BarRenderer renderer = new BarRenderer();//创建Renderer
renderer.setItemURLGenerator(new StandardCategoryURLGenerator("xy_chart.jsp","series","section"));//创建URLGenerator.再不需要连接的情况下将第一个参数设置成"###"就可以了
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());//创建提示标签
Plot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);//创建图表区域对象
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
chart.setBackgroundPaint(java.awt.Color.white);//创建图表
// Write the chart p_w_picpath to the temporary directory
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());//该工具类上面没有介绍,在鼠标移动到图片时显示提示信息是用Map实现的,这些Map是用该类生成的。
filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);//保存图表为文件
// Write the p_w_picpath map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info);//生成Map信息。这些信息写在pw的输出流中,这里的输出流就是Response.out。也就是直接输出到页面了
pw.flush();
} catch (NoDataException e) {
System.out.println(e.toString());
filename = "public_nodata_500x300.png";
} catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "public_error_500x300.png";
}
return filename;
}
二.图表显示:
<%
......
String filename = WebHitChart.generateBarChart(dDate, session, new PrintWriter(out));//获得图片的文件名。注意该语句写在jsp文件(bar_chart.jsp)的开头,而用out的封装类作为参数,访问该页面后可以看到生成Map热点的内容输出再该页面的开头部分。也就是说最好是把这几句话写在页面有输出之前。
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;//显示图片的Servlet全路径名,另外文件名作为该Servlet的参数
......
%>
......
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
src指定了servlet的全路径名,usermap指定了使用的热点。
该Servlet必须在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>
该Servlet的作用就是将图片文件的二进制流数据写道response的输出流中,在客户端也就显示成了图片。
,下载jfreechart.rar后解压,将jfreechart-1.0.2\lib下的 6个JAR文件 拷贝到 我的JSP文件所在目录的/WEB_INF/lib下和Tomcat 6.0\common\lib下,修改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>
JSP实例:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.DefaultCategoryDataset,org.jfree.chart.ChartUtilities" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body bgcolor="#FFFF99">
<%
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(300,"beijing","apple");
dataset.addValue(200,"beijing","banane");
dataset.addValue(500,"beijing","watermelon");
JFreeChart chart = ChartFactory.createBarChart3D("水果销量统计图","水果","销量",dataset,PlotOrientation.VERTICAL,false,false,false);
String filename = ServletUtilities.saveChartAsJPEG(chart,400,300,null,null);
String url = request.getContextPath()+"/servlet/DisplayChart?filename="+filename;
%>
<img src="<%= url%>" border="1" />
</body>
</html>
显示结果如下:
JFreeChart库包的简介
org.jfree.chart
这个包包含JfreeChart类库中主要的类和接口
org.jfree.chart.annotations
这个包提供了一套给Chart增加小文字和图片项的机制,通常是为了润色特定的数据项。
org.jfree.chart.axis
这个包包含所有轴有关的类和接口:
a.CategoryPlot 和 XYPlot 操作两个轴(默认),我们叫他们domain轴和range轴。这些专用名词是建立这些地图可视化地把domain轴的值映射到value轴上的概念之上。
效果上,domain轴作为x轴,range作为y轴,但我们更热衷与专用名词
b.轴类提供的默认设置基本适合大多数程序的需要,但是,有很多通过JFreeChartAPI改变属性来定制轴的特性。一定要通过读API来熟悉可以定制的选项。
c.JFreeChart的一个更强大的功能是同一个Chart可以提供多个domain轴和多个value轴
轴类是可克隆和可串行化的。
org.jfree.chart.entity
这个包包括展现Chart中实体的类
org.jfree.chart.event
这个包包括跟改变Chart属性相关的发送和接收事件有关的类和接口。默认,库中的类自动把他们注册给其他类,所以他们会自动接收事件并相应地起作用。更大程度上,你只需要简单地依赖默认的行为。
org.jfree.chart.p_w_picpathmap
这个包包括创建HTML图像映射的类和接口,图像能用ChartUtilities创建,典型例子是来自servlet。
org.jfree.chart.labels
这个包包括为个别数据产生标签的类和接口,有两种标签类型:
a.item labels --作为chart一部分的小文字标签
b.tooltips -- 当鼠标滑到数据项时展示的文字
org.jfree.chart.needle
这个包包括在圆形图中画指针的类和接口
org.jfree.chart.plot
这个包包括:
a.Plot基类
b.一系列Plot的子类
c.各种支持的类和接口
这是一个很重要的包,因为Plot类在JFreeChart中控制和展示数据中起着关键作用
org.jfree.chart.renderer
这个包包括用来扩展渲染器的类和接口,渲染器是一个负责在CategoryPlot或XYPlot上画出个性化的数据项。
渲染器或通过修改现有属性或扩充一个新的渲染器来提供一定程度上Chart外表改变。
org.jfree.chart.servlet
这个包包括Servlet的辅助类
org.jfree.chart.title
这个包包括作为Chart标题或子标题的类,JFreeChart操作一个标题和多个子标题,当画chart的时候,标题和子标题会占用一块空间来画他们自己,这样画图空间就少了,所以尽管对子标题的数目没有限制,但你经可能的少用子标题。
org.jfree.chart.ui
这个包包括改变Chart属性的用户界面类,这个包是可选的,他们用在示例程序中,如果你的程序用不到他们,你不需要把他包括进你的应用程序。
org.jfree.chart.urls
这个包支持在HTML图片上添加URL
org.jfree.data
这个包包括为JFreeChart提供数据集的类和接口。在设计JFreeChart的一个原则就是数据和展示完全分开,所以,在数据集的类里面你找不到任何与展示有关的属性和方法。
org.jfree.data.statistics
这个包包括展示数据统计的类和接口
org.jfree.data.time
这个包包括展示基于时间的数据的类和接口。
TimeSeriesCollection应该是最重要的类,他用来存储一个或多个TimeSeries对象,并提过一个对XYDataset接口的扩展,这样他被允许作为XYPlot的一个数据集。
TimePeriodValuesCollection这个类执行相似的功能,但是可以用更通用的时间段。
org.jfree.data.xml
这个包包括支持从XML文件读取数据集的类和接口。