- 浏览: 145148 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jackroomage:
-HashMap 类 (除了不同步和允许使用 null ...
map,set,list,等JAVA中集合解析 -
bin_1715575332:
讲得很形象,呵呵。
Spring如何实现IOC与AOP的 -
love_miaohong:
表达的很清晰!
map,set,list,等JAVA中集合解析 -
Wuaner:
引用 4,sleep必须捕获异常,而wait,notify和n ...
sleep() 和 wait() 的区别 -
javawen:
dadsdddddd
java 异常类
自己最近学习了JfreeChart的使用,觉得这个冬冬的功能非常强大,总结一下。主要介绍JfreeChart生成图片的几种方式
先从网上找点介绍。
一、简介
WW
的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这
两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用
HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目的客户端,因此在这里也变得无能为力。回到本文
的题目上来,为了创建一个可以在web浏览器上查看到图表一般有两种做法:第一种就是使用applet利用java本身对图形的支持来显示一个图表;第二
种就是直接在web服务器端生成好图表图片文件后发送给浏览器。第一种方式显然对于客户端要求太高,随着现在主流浏览器放弃对JAVA的支持后,这种方式
只适合一些局域网的应用,而对于因特网的环境就显得不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生基于WEB的图表。
JFreeChart 项目简介
JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普
通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。
二、JFreeChart获取。
JFreeChart
是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:
1.JFreeReport :报表解决工具
2.JFreeChart:Java 图形解决方案(Application/Applet/Servlet/Jsp)
3.JCommon :JFreeReport和JFreeChart的公共类库
4.JFreeDesigner :JFreeReport的报表设计工具
我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),
获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)
我们以当前最新版本:jfreechart-1.0.1.zip为例子进行说明。
三、JFreeChart配置安装
1
、解压jfreechart-1.0.1.zip.zip到指定位置,其中source是jfreechart的源码,jfreechart-
1.0.1-demo.jar 是例子程序,可以先运行一下看看各种效果,就知道他的nb之处了。
2 、为了配置成功,我们需要关注的文件有如下三个:
设置classpath。加入下面三个jar包。
jfreechart-1.0.1.jar 、jcommon-1.0.0.jar、gnujaxp.jar
加上第三个jar包有时web.xml会报错,把它去掉就好了。
至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果是中文显示的时候可能依据观感需要改变源
码的字体。
四、JFreeChart功能介绍
JFreeChart 目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面:
pie charts (2D and 3D) :饼图(平面和立体)
bar charts (regular and stacked, with an
optional 3D effect) :柱状图
line and area charts :曲线图
scatter plots and bubble charts
time series, high/low/open/close charts and candle
stick charts :时序图
combination charts :复合图
Pareto charts
Gantt charts :甘特图
wind plots, meter charts and symbol charts
wafer map charts
( 态图表,饼图(二维和三维) , 柱状图 ( 水平,垂直),线图,点图,时间变化图,甘特图,
股票行情图,混和图, 温度计图, 刻度图等常用商用图表)
图形可以导出成PNG和JPEG格式,同时还可以与PDF和EXCEL关联
JFreeChart 核心类库介绍:
研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形
本身有关,后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究 。
核心类主要有:
org.jfree.chart.JFreeChart
:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet:
数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot
:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator:
用于生成Web图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
个人感觉JFreeChart可以满足大部分图片创建的需要,美中不足的是:对字体的设置做的不够好,特别是使用中文的时候字体很不清晰。因为这个原因建
议你自己去修改他的源代码,最好使用properties文件去设置字体.还有就是文档要钱所以要多花点时间去看源代码。或多上社区.
五.开始开发
对JfreeChart有了初步了解并做好准备工作之后,开始作例子程序试验。在这里我只介绍饼图的做法,而这张图采用不同的方式进行输出,其他类型的图
片可以参考jfreechart提供的例子,做法都差不多。
1) 直接生成图片
public class PieChartPicture { public static void main(String[] args) { PieDataset dataset = getDataSet(); JFreeChart chart = ChartFactory.createPieChart3D( " 项目进度分布", // chart title dataset,// data true,// include legend true, false ); PiePlot3D plot=(PiePlot3D)chart.getPlot(); // 图片中显示百分比:默认方式 //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT)); // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位 plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%"))); // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例 plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})")); // 设置背景色为白色 chart.setBackgroundPaint(Color.white); // 指定图片的透明度(0.0-1.0) plot.setForegroundAlpha(1.0f); // 指定显示的饼图上圆形(false)还椭圆形(true) plot.setCircular(true); // 设置图标题的字体 Font font = new Font(" 黑体",Font.CENTER_BASELINE,20); TextTitle title = new TextTitle(" 项目状态分布"); title.setFont(font); chart.setTitle(title); FileOutputStream fos_jpg = null; try { fos_jpg=new FileOutputStream("D:\\ 项目状态分布.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg,1,chart,640,480,null); fos_jpg.close(); } catch (Exception e) { } } private static PieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue(" 市场前期", new Double(10)); dataset.setValue(" 立项", new Double(15)); dataset.setValue(" 计划", new Double(10)); dataset.setValue(" 需求与设计", new Double(10)); dataset.setValue(" 执行控制", new Double(35)); dataset.setValue(" 收尾", new Double(10)); dataset.setValue(" 运维",new Double(10)); return dataset; } }
2) 采用servlet和struts的action方式输出
采用这种方式输出,不用生成图片。
A .servlet输出
public class PieByServlet extends HttpServlet{ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("image/jpeg"); PieDataset dataset = getDataSet(); JFreeChart chart = ChartFactory.createPieChart3D( " 水果饼图", // chart title dataset,// data true, // include legend true, false ); //设置图表属性 // 输出图片 ChartUtilities.writeChartAsJPEG(res.getOutputStream(),1,chart,800,600,null); }
B .struts的action方式输出
只将这条语句加上try catch即可,并返回null。
try{ ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null); } catch (Exception e) { } return null;
其实采用这两种方式与生成图片的方式改动并不大
加上语句response.setContentType("image/jpeg");
ChartUtilities.writeChartAsJPEG(new FileOutputStream("D:\\
项目状态分布.jpg");,100,chart,640,480,null);
文件流改成response的输出流就可以了
hartUtilities.writeChartAsJPEG(response.getOutputStream(),1,chart,800,600,null);
3)jsp+servlet+javabean方式
1. Create ChartViewer servlet
public class ChartViewer extends HttpServlet { public void init() throws ServletException { } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // get the chart from session HttpSession session = request.getSession(); BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage"); // set the content type so the browser can see this as a picture response.setContentType("image/png"); // send the picture PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9); response.getOutputStream().write(encoder.pngEncode()); } //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Process the HTTP Put request public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } //Clean up resources public void destroy() { } }
2. Create a servlet map in web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>ChartViewer</servlet-name> <servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class> </servlet> <servlet-mapping> <servlet-name>ChartViewer</servlet-name> <url-pattern>/servlet/ChartViewer</url-pattern> </servlet-mapping> </web-app>
3. Create a chart in a java bean (Pie3DDemo.java)
public class Pie3DDemo { private DefaultPieDataset getDataset() { // categories... String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" }; // data... double[] data = new double[section.length]; for (int i = 0; i < data.length; i++) { data[i] = 10 + (Math.random() * 10); } // create the dataset... DefaultPieDataset dataset = new DefaultPieDataset(); for (int i = 0; i < data.length; i++) { dataset.setValue(section[i], data[i]); } return dataset; } public String getChartViewer(HttpServletRequest request, HttpServletResponse response) { DefaultPieDataset dataset = getDataset(); // create the chart... JFreeChart chart = ChartFactory.createPie3DChart( "Pie3D Chart Demo", // chart title dataset, // data true, // include legend true, false ); // set the background color for the chart... chart.setBackgroundPaint(Color.cyan); PiePlot plot = (PiePlot) chart.getPlot(); plot.setNoDataMessage("No data available"); // set drilldown capability... plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section")); plot.setLabelGenerator(null); // OPTIONAL CUSTOMISATION COMPLETED. ChartRenderingInfo info = null; HttpSession session = request.getSession(); try { //Create RenderingInfo object response.setContentType("text/html"); info = new ChartRenderingInfo(new StandardEntityCollection()); BufferedImage chartImage = chart.createBufferedImage(640, 400, info); // putting chart as BufferedImage in session, // thus making it available for the image reading action Action. session.setAttribute("chartImage", chartImage); PrintWriter writer = new PrintWriter(response.getWriter()); ChartUtilities.writeImageMap(writer, "imageMap", info); writer.flush(); } catch (Exception e) { } String pathInfo = "http://"; pathInfo += request.getServerName(); int port = request.getServerPort(); pathInfo += ":"+String.valueOf(port); pathInfo += request.getContextPath(); String chartViewer = pathInfo + "/servlet/ChartViewer"; return chartViewer; }
6. 页面
<html> <head> <title>Pie Chart Demo</title> </head> <jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" /> <body> <h2>Pie Chart Demo</h2> <%String chartViewer = myChart.getChartViewer(request, response);%> <img src="<%=chartViewer%>" border=0 usemap="#imageMap"> </body> </html>
4)采用工具类ChartUtil和DisplayChart(jfreechart的
servlet)输出
我用了上面的几个方法输出图片,发现页面里只能输出一个图片,
不过下面的方法可以输出多个图片,而且是几种方式中最简单的一个,推荐使用。
这种方式和上面的三种比较类似,是将javabean里的生成图片的方法写的一个工具类ChartUtil里面。
1 .添加工具类ChartUtil
public class ChartUtil {
// 产生时间序列图,返回图片名称
public static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) { String filename = null; try { if (session != null) { ChartDeleter deleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter"); session.removeAttribute("JFreeChart_Deleter"); session.setAttribute("JFreeChart_Deleter", deleter); } JFreeChart chart = ChartFactory.createPieChart3D( title, // chart title dataset, // data true, // include legend true, false ); // Write the chart image to the temporary directory ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); //If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving. //If the last parameter is a session object, the chart remains until session time out. filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, filename, info,true); pw.flush(); } catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "picture_error.png"; } return filename; } }
2、在action里统计数据,设置好数据集dataset。传到页面
3、 在页面里取出
DefaultPieDataset
piedataset=(DefaultPieDataset)request.getAttribute("piedataset");
// 用ChartUtil工具类产生图片
String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,null, new PrintWriter(out)); String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;
通过以下方式输出
<td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>
4、在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>
5) ApplicationFrame 方式
public class PieChartDemo1 extends ApplicationFrame { public PieChartDemo1(String title) { super(title); setContentPane(createDemoPanel()); } private static JFreeChart createChart(PieDataset dataset) { JFreeChart chart = ChartFactory.createPieChart( ....... return chart; } public static JPanel createDemoPanel() { JFreeChart chart = createChart(createDataset()); return new ChartPanel(chart); } public static void main(String[] args) { PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1"); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } }
六. 可参考资料与网址
官方网站
[url]http://www.jfree.org/jfreechart/index.html [/url]
官方论坛
http://www.jfree.org/phpBB2/index.php
API 文档
[url]http://www.jfree.org/jfreechart/api/gjdoc/index.html [/url]
中文API
[url]http://blog.sina.com.cn/u/405da78d010000ap [/url]
好了,唠叨了这么多,自己写了一些,从网上找了一些,真tmd的很累啊。
转自:http://ltc603.iteye.com/blog/30207
发表评论
-
为什么匿名内部类参数必须为final类型(转)
2014-06-25 15:42 5451) 从程序设计语言的 ... -
Java finally语句到底是在return之前还是之后执行?
2014-05-15 16:48 641请查收附件 -
JVM调优总结 -Xms -Xmx -Xmn -Xss(转)
2012-11-26 11:18 762堆大小设置 JVM 中最大堆大小有三方 ... -
线程池ThreadPoolExecutor使用简介
2012-10-26 14:39 967一、简介 线程池类为 java.util.concurrent ... -
线程的7种状态及相互转换
2011-11-06 13:06 725先从图片开始 小小的作下解释: 1、线程的实现有两种方 ... -
Java设计模式之Observer
2011-03-24 14:15 875Java设计模式之Observer ... -
java定时器在web中的应用
2011-03-02 16:44 871好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过 ... -
使用activeMQ实现jms(转)
2010-11-03 16:59 998一:jms介绍 ... -
Jms基础知识整理(转)
2010-11-03 16:55 604详情见附件。 转载自:http://www.iteye.co ... -
java 线程Thread.Sleep详解(转)
2010-10-26 14:43 1028我们可能经常会用到 Thread.Sleep 函数来使线程挂起 ... -
在Eclipse中使用JUnit4进行单元测试(转)
2010-09-01 14:23 673详情见附件 转载自:http://blog.csdn. ... -
AOP是什么?(转)
2010-07-21 11:18 755为什么要区分J2EE容 ... -
J2EE 中的13种技术规范
2010-07-13 18:06 779J2EE 平台由一整套服务( Services ... -
XML解析技术研究(转)(二)
2010-07-12 15:51 7694、结论 随着XML的广泛应用,XML解析技术作为XML ... -
XML解析技术研究(转)(一)
2010-07-12 15:29 1146摘要 : XML 作为过去十年中出现的最流行的技术之一,得到了 ... -
sleep() 和 wait() 的区别
2010-07-09 18:06 954这两者的施加者是有本质区别的. sleep()是让某个线程暂停 ... -
Struts2操作Request、Session和Application对象 (转)
2010-05-06 16:48 1005Strtus2通常情况下使用以下两种方式来访问上述三种对象,即 ... -
Java对象与json对象的转行
2010-04-19 23:31 1482jsontools 工具包可以将Java对象转化成json对象 ... -
Java注解(Annotation)(转)
2010-04-09 11:53 1670(1) Annotation(注释)是JDK5.0及以后版本引 ... -
Json工具类(转)
2010-04-08 10:55 1894Json工具类 jqGrid在处理多字段查询的时候要使用js ...
相关推荐
JfreeChart学习总结JfreeChart学习总结
### JFreeChart学习总结 #### 一、为什么学习JFreeChart? 随着互联网技术的飞速发展,越来越多的应用程序转向了Web平台。这不仅包括传统的静态网页,也涵盖了那些需要复杂数据展示的应用,如报表系统。然而,从...
**JFreeChart学习总结** JFreeChart是一款强大的Java图表库,它允许开发者在Java应用程序、Swing组件或Web应用中创建各种复杂的图表。这个库涵盖了多种图表类型,包括折线图、柱状图、饼图、散点图、甘特图等,能够...
**JFreeChart学习指南** JFreeChart是一款强大的Java图表库,它允许开发者在应用程序、Swing组件、Applet或Web应用中创建各种复杂的图表。这个库涵盖了多种图表类型,包括柱状图、饼图、线图、散点图、甘特图等,...
### JFreeChart使用总结 #### 一、JFreeChart简介 JFreeChart是一个强大的Java图表绘制库,由JFree组织开发并维护。该库提供了一系列丰富的API,支持开发者创建多种类型的图表,包括但不限于饼图、柱状图、线图、...
总结而言,JFreeChart 不仅是一个功能强大的图表生成库,而且拥有活跃的社区支持,提供了详尽的文档和示例代码。无论是初学者还是有经验的开发者,都能够通过本文档快速上手并熟练掌握 JFreeChart 的使用技巧。
如果你还在java EE 门口徘徊,常用开发组件介绍>将是你最好的向导;如果你已经入门了,那恭喜你,你将更容易从全局上把握自己的学习方向...
在本篇“JFreeChart学习笔记3-简单Line图形创建”中,我们将深入探讨如何使用JFreeChart库在Java环境中创建基本的线性图表。JFreeChart是一个强大的、开源的Java图表库,它允许开发者轻松地生成各种类型的图表,包括...
**JFreeChart 操作总结** JFreeChart 是一个强大的 Java 图表库,它允许开发者创建各种复杂的图表,如饼图、柱状图、...在实际开发中,根据具体需求进行深入学习和定制,JFreeChart 将成为你强大的数据可视化工具。
**jFreeChart学习资源概述** jFreeChart是一个强大的开源Java库,用于生成高质量的图表,包括线图、柱状图、饼图、散点图、甘特图等多种类型的图表。这个资源包包含了学习jFreeChart所需的所有关键元素,包括jar...
总结来说,JFreeChart是Java开发中不可或缺的工具,它提供了丰富的图表库和强大的定制能力,无论是在企业级应用还是个人项目中,都能展现出强大的图形处理能力。通过深入学习和实践,开发者可以利用JFreeChart轻松...
**"jfreechart 总结.txt" 和 "JFreeChart.txt"** 文件可能包含了JFreeChart的使用总结、技巧、注意事项或者其他开发者的经验分享,对于学习和使用JFreeChart来说是非常宝贵的参考资料。 总的来说,JFreeChart是一个...
2. 易用性:FusionCharts提供了一套完整的API和示例代码,使得开发者能够快速上手,而jFreeChart的学习曲线相对较陡峭。 3. 平台兼容性:FusionCharts基于Web技术,因此可以跨平台运行,适用于移动设备和桌面系统,...
《JFreeChart学习指南——深度探索数据可视化》 在数据科学和数据分析领域,有效的数据可视化是至关重要的。JFreeChart,作为一个强大的Java图表库,为我们提供了丰富的图表类型,包括柱状图、饼状图和曲线图等,...
**JFreeChart 代码总结** JFreeChart 是一个流行的 Java 库,用于创建高质量的图表,包括线图、柱状图、饼图、散点图等。它在各种应用程序中被广泛使用,如报告、仪表板和数据分析工具。这篇博客文章([链接]...
**JFreeChart是一种广泛使用的Java...总结来说,"JfreeChart各种图形案例"这个资源是一份宝贵的开发工具,无论你是初学者还是有经验的开发者,都可以从中受益,快速掌握JFreeChart的使用技巧,提升你的数据可视化能力。
总结起来,这个压缩包提供了全面的资源,帮助开发者利用JFreeChart创建图表,并结合JasperReport进行报表设计。中文文档降低了学习曲线,使得国内开发者能更轻松地掌握这两个工具。在实际项目中,它们可以用来构建...