下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用JfreeChart开发图表经验总结(含源码)Keith He 2005年10月27日最近,公司一项目要出很多的图表。由于项目是B/S架构的,所以生成的图表也要考虑能在浏览器上动态显示。生成基于浏览器的图表方式比较多。据我所知道的,常用的有三种:1、 VML方式实现。这种方式是通过产生客户端的代码,由客户端根据代码生成相应的图表。但这种方式产生的图表有很多的局限性,如受限于浏览器,有些浏览器可能并不支持VML。另外,没有封装完整的图表开发包。2、 通过applet来产生图表。这种方式也对客户端要求比较高,必须要有JRE,而且通过applet生成的图表在加载过程中会有个Java的Log动画。
2、用户看了可能会感觉不太舒服。3、 通过服务端直接生成图表的图片。这种方式对客户端几乎没有什么要求,缺点是加重了服务端的负担,对服务端要求就相对高了点。经过比较,根据项目自身特点,我们打算采用第三种方式来开发图表。为了缩短开发周期、节约成本,我们选用了开源的JFreeChart()。jfreechart是一个免费创建图表的java工具,目前最新版本是JFreeC。它可以生成各式各样的图表。这些图表包括饼图、柱状图、线形图、区域图、甘特图等等,基本可以满足各种项目的要求。但在开发过程中我也发现了JFreeChart的一些不足,或者说有些称得上是BUG。总体说来,JFreeChart还是个优秀的开源
3、项目。关于JFreeChart生成图表的文章比较多了,我主要谈谈使用JFreeChart的一些比较棘手问题以及解决方法。同时也会将问题所用到的源码(JFreeC+Struts)从项目中抽象出来一起提供给大家。一、 图片上热点链接中文乱码的解决方法这个问题是在我查阅关于JFreeChart相关资料时出现频率最高的一个问题。其实这个乱码问题不能怪罪于JFreeChart。有人甚至就因此认为JFreeChart对中文支持不太完善,JFreeChart可要叫了:我是冤枉的!我们来找出问题产生的原因,这个问题也就不难解决了。首先查看一下出现问题页面的Html源文件,你会发现在源文件的开头多出了一段map
4、代码,代码类似于这样:<map id="chart-30928.png" name="chart-30928.png"><area shape="poly" coords="179,163,176,154,174,145" title="洗衣机=315(29.86%)" alt=""/></map><html><head>这部分map代码其实是JFreeChart产生的,是用来产生图片上的热点链接,这也是问题产生的根
5、源所在。你的Jsp页面通过<% page contentType="text/html; charset=UTF-8" %>或者<% page contentType="text/html; charset=GBK" %>来设置contentType这无可厚非,但map并不是由这个jsp页面产生的。它是JFreeChart通过PrintWriter产生的。查看一下你生成图片的Chart源码,其中有ChartUtilities.writeImageMap(pw, filename, info, false)这样的语句。这是用来向页面
6、写入map代码的。默认情况下,map代码会以服务器默认编码(ISO-8859-1)输出。这就和你的Jsp编码不一致,从而产生乱码。原因找到了,问题也就不难解决的。设置PrintWriter的contentType与Jsp的contentType保存一致就可以了。代码如下(笔者的Web应用是基于Struts框架的):/PieMothAciton.javapublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse respons
7、e)throws Exception /设置输出编码格式response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();String filename = chart.generatePieChart3D("月统计比例图", session, out);String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fil
8、ename;request.setAttribute("filename",filename);request.setAttribute("graphURL",graphURL);return mapping.findForward(SUCCESS);重新部署你的Web应用,中文乱码文件就可以解决了。二、 饼图显示百分比在饼图中JFreeChart默认只显示选项和数值,没有显示各项所占比例。由于手头没有1.0版的JFreeChart Developer Guide(这可是要钱的,后来想想即使有,也未必能找到关于百分比这方面的说明),再加上DEMO中的饼图
9、都没有显示百分比,无法参考。后来在网上找到了一个老版本的例子,其中能显示百分比。它是通过在PiePlot中设置的:PiePlot pie;pie.setPercentFormatString("#,#0.0#%");但1.0版本中根本就找不到setPercentFormatString这方法,JFreeChart各版本之间改动比较大,很难兼容。还好它是开源的,把它的源码都搜索了一遍,认真读了一些源码,终于理出了头绪。StandardPieItemLabelGenerator构造函数中了,StandardPieItemLabelGenerator有三个构造函数。Standar
10、dPieItemLabelGenerator()不显示各项所占比例。另外两个可以显示比例。代码如下:plot.setLabelGenerator(new StandardPieItemLabelGenerator(StandardPieItemLabelGenerator.DEFAULT_TOOLTIP_FORMAT);/或者采用下面自定义样式显示,0表示选项,1表示数值,2表示所占比例plot.setLegendLabelGenerator(new StandardPieItemLabelGenerator("0: (1M, 2)");效果如下图:默认显示百分比是取整的,
11、如果要让百分比保留二位小数,可以用第三个构造函数:plot.setLabelGenerator(new StandardPieItemLabelGenerator(“0=1(2)”,NumberFormat.getNumberInstance(),new DecimalFormat("0.00%");效果如下图:三、 混合图表(不同类型的图混合显示)我们经常用的是柱状图、曲线图、和饼图,这三类型图基本能满足大部分项目的需求。但有些项目比较特殊,可能需要在一张图上同时显示不同类型的图。这在JFreeChart中可以轻松实现。例如我们要做个流量监控的系统,该系统一天中在不同的时
12、间段有不同的阀值(最大值),该阀值表示成阶梯线。而实际流量就是个曲线了。当流量在某个时段内超过阀值时就触发相应的事件(如限流)。要表示阀值和流量的对比关系就需要两种类型的图片在同一张图表上表示,如下图:首先像创建普通图表一样来创建图片,笔者先创建了一个XYStep Chart。然后创建第二图表的Renderer,再分别将第二图表的Dataset、Renderer添加进第一图表的plot。实例代码如下:/MultipleChart.javaJFreeChart jfreechart = ChartFactory.createXYStepAreaChart("监控设置", &q
13、uot;时刻", "流量", xydataset, PlotOrientation.VERTICAL, true, true, false); XYPlot xyplot = jfreechart.getXYPlot(); /设置第二图表的Renderer StandardXYItemRenderer standardxyitemrenderer = new StandardXYItemRenderer(); standardxyitemrenderer.setToolTipGenerator(new StandardXYToolTipGenerator(&quo
14、t;0(1) = 2", new SimpleDateFormat("HH:mm"), new DecimalFormat("#,#0"); /将第二图表的Dataset、Renderer添加进xyplot xyplot.setDataset(1, lineDataset); xyplot.setRenderer(1,standardxyitemrenderer); 这样就创建了曲线和阶梯的混合图表。四、 其它问题1) 版本问题。JFreeChart的各版本变动比较大,这在升级版本时是比较头疼的问题,升级时需要改动你代码的地方可能比较多。因此尽量采用最新的版本,新版本的文档可能比较少,但问题要相对少一些,在旧版中就出现过标注数值重叠在一起这样的问题。好的是JFreeChart是开源的,碰到解决不了的问题可以从源码中找到有参考价值的信息。2) 设置背景透明度的BUG不知道这是不是JFreeChart的一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年智能药箱定时提醒与用药管理功能应用
- 护理管理的职业发展
- 2026年地下管线事故应急响应机制:外力破坏事故降幅超92%的北京经验
- 2026年柔性夹爪选型四步法需求建模参数对比实测验证成本优化
- 2026年整车检修能力625辆 年的产线规划与能力提升
- 2026年超大规模智算集群建设提升智能算力高质量供给技术方案
- 2026年网络安全数据保护
- 2026年太极拳入门教程养生课件
- 2026年实验室生物安全柜使用培训
- 2026年上班族养生保健操课件
- PSP问题解决流程分析
- 3.1.1农业区位因素及其变化-仙居杨梅的地理密码【知识探究】高中地理人教版(2019)必修二
- 部编版小学语文四年级下册教师(教学参考)
- 2025北京丰台高三一模化学试题及答案
- 《先兆流产中西医结合诊疗指南》
- MySQL数据库原理及应用 教学大纲 及 课后习题答案(王坚)
- 2025年度民办非企业单位工作计划
- 《植物生产与环境》考试复习题库
- 大学生魅力讲话实操学习通超星期末考试答案章节答案2024年
- 《游园》课件统编版高中语文必修下册
- 【盒马鲜生冷供应链物流成本现状、问题及优化建议探析11000字(论文)】
评论
0/150
提交评论