JFreechart学习笔记(zz)

22 views
Skip to first unread message

singba

unread,
Feb 5, 2007, 9:44:41 PM2/5/07
to JSF/AJAX技术讨论
JFreeChart中几个核心的对象类:
JFreeChart


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 image to the temporary
directory

ChartRenderingInfo info = new
ChartRenderingInfo(new StandardEntityCollection());//该工具类上面没有介绍,在鼠标移动到图
片时显示提示信息是用Map实现的,这些Map是用该类生成的。

filename = ServletUtilities.saveChartAsPNG(chart,
500, 300, info, session);//保存图表为文件

// Write the image 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的输出流中,在客户端也就显示成了图片。

singba

unread,
Apr 5, 2007, 5:24:49 AM4/5/07
to JSF/AJAX技术讨论
使用JFreeChart时我也出现了不刷新的问题,下面时一些讨论,没有试过,暂时放再这里。我的方式与发贴的楼主一样,都是用的第2种方式:
Topic: 在JSP页面中显示JFReeChart 3D图片的位置问题?
Print this page

--------------------------------------------------------------------------------
1.在JSP页面中显示JFReeChart 3D图片的位置问题? Copy to clipboard
Posted by: struggle
Posted on: 2004-09-13 18:47

我用jfreechart生成的3D PIE图片如下:


--------------------------------------------------------------------------------
2.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-09-13 18:54

现在我想让图片显示在页面中间,如下图所示:
那么应该怎样修改源代码呢?或者有其他比较简单一点的方法也可以


--------------------------------------------------------------------------------
3.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-09-13 19:13

我只想到可以用三种方法:
1)是先生成PNG格式的图片,然后保存到一文件夹中。然后在JSP页面引用这张图片,就可以将其放到页面的任意位置了。但是由于此JSP页面需要生成
许多不同的3D PIE图,而且有多用户来生成。如果生成的文件名是随机的,那么是能够实现的,只是此文件夹下的图片会越来越多,膨胀比较迅速。当然可
以采取先生成后删除的方法,但是由于本人能力非常有限,感觉无从下手。好像JFREECHART本身就是这么做的。
2)和1)有些类似,先生成PNG格式的图片,然后保存到一文件夹中。然后在JSP页面引用这张图片。只是生成的文件名固定,这样当某一用户点击新链接
生成某一图片时,会覆盖以前的图片。也就是说文件名不变,但是内容已经改变。这里又有一个问题:就是文件夹中的图片能迅速更新,但是显示在JSP页面上
的图片却不是实时更新的。以为是刷新的问题,于是让程序每一次都强制刷新一次,问题依旧。但是如果让点击不同的链接之间的时间间隔长一些(比如5秒),
是会看到图片更新的。不只问题在何处。
3)就是改源代码了。但本人能力非常有限,感觉很困难。

诚请各位大侠帮帮忙,能修改源代码最好,有其他比较简单可行的方法也可。谢谢!!!

--------------------------------------------------------------------------------
4.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: koji
Posted on: 2004-09-13 20:12

簡單一點的話用frame八
做好一個框框
然後中間框框就是輸出圖片

koji

--------------------------------------------------------------------------------
5.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-09-14 08:57

不好意思,我上面忘了说了。这里已经放在frame里了。只是这地方还要放其他类型的比较大的图片,所以只好将地方留大一点。而生成的3D饼图如果也拉
到很大的话会非常不好看。

谢谢koji

--------------------------------------------------------------------------------
6.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: koji
Posted on: 2004-09-14 14:58

不一定要很大呀,我沒碰最近的版本
但是chart我記得都是寫到outputstream,所以通常都是一整頁都是圖片八?

所以你應該做成一個
--------------------
|圖片|
---------------------
中間放圖片
夠暴力吧~~
不然依照你想法還要放圖片
那麼就算chart api製造空白業對你來說也不行八?

koji

--------------------------------------------------------------------------------
7.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-09-14 17:31

谢谢koji的热心解答!
是的我刚开始是用OUTPUTSTREAM做的,就是在一个FRAME里输出一个STREAM流。图片就出现在了FRAME的左面。

http://www.cjsdn.net/post/view?bid=30&id=111530&tpg=1&ppg=1&sty=1#111741

--------------------------------------------------------------------------------
8.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-09-21 15:08

cewolf用的也是JFreeChart画的图,只是加了JSP标签而已。而我学艺不精,看到JSP标签就头痛!

请教大家能否用上面我列的第二种方法给予解决啊?即:

和1)有些类似,先生成PNG格式的图片,然后保存到一文件夹中。然后在JSP页面引用这张图片。只是生成的文件名固定,这样当某一用户点击新链接生成
某一图片时,会覆盖以前的图片。也就是说文件名不变,但是内容已经改变。这里又有一个问题:就是文件夹中的图片能迅速更新,但是显示在JSP页面上的图
片却不是实时更新的。以为是刷新的问题,于是让程序每一次都强制刷新一次,问题依旧。但是如果让点击不同的链接之间的时间间隔长一些(比如5秒),是会
看到图片更新的。不知问题在何处。
谢谢!!!

--------------------------------------------------------------------------------
9.Re:在JSP页面中显示JFReeChart 3D图片的位置问题? [Re: struggle] Copy to clipboard
Posted by: struggle
Posted on: 2004-10-09 09:37

问题已经解决:保存文件时不保存为PNG格式,而是JPG格式就可以了。只是效果稍差一些。

Reply all
Reply to author
Forward
0 new messages