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的输出流中,在客户端也就显示成了图片。
--------------------------------------------------------------------------------
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格式就可以了。只是效果稍差一些。