




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用JFreeChart工具生成统计图的几种方法一、简介 WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目的客户端,因此在这里也变得无能为力。回到本文的题目上来,为了创建一个可以在web浏览器上查看到图表一般有两种做法:第一种就是使用applet利用java本身对图形的支持来显示一个图表;第二 种就是直接在web服务器端生成好图表图片文件后发送给浏览器。第一种方式显然对于客户端要求太高,随着现在主流浏览器放弃对JAVA的支持后,这种方式 只适合一些局域网的应用,而对于因特网的环境就显得不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生基于WEB的图表。 JFreeChart 项目简介 JFreeChart是开放源代码站点SourceF上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普 通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。二、JFreeChart获取。 JFreeChart 是JFreeChart公司在开源网站SourceF上的一个项目,该公司的主要产品有如下: 1.JFreeReport :报表解决工具 2.JFreeChart:Java 图形解决方案(Application/Applet/Servlet/Jsp) 3.JCommon :JFreeReport和JFreeChart的公共类库 4.JFreeDesigner :JFreeReport的报表设计工具 我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取), 获取地址:/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) 直接生成图片Java代码 1 public class PieChartPicture 2 public static void main(String args) 3 4 PieDataset dataset = getDataSet(); 5 JFreeChart chart = ChartFactory.createPieChart3D( 6 项目进度分布, / chart title 7 dataset,/ data 8 true,/ include legend 9 true, 10 false 11 ); 12 PiePlot3D plot=(PiePlot3D)chart.getPlot(); 13 / 图片中显示百分比:默认方式 14 /plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT); 15 / 图片中显示百分比:自定义方式,0 表示选项, 1 表示数值, 2 表示所占比例 ,小数点后两位 16 plot.setLabelGenerator(new StandardPieSectionLabelGenerator(0=1(2), NumberFormat.getNumberInstance(), new DecimalFormat(0.00%); 17 / 图例显示百分比:自定义方式, 0 表示选项, 1 表示数值, 2 表示所占比例 18 plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(0=1(2); 19 / 设置背景色为白色 20 chart.setBackgroundPaint(Color.white); 21 / 指定图片的透明度(0.0-1.0) 22 plot.setForegroundAlpha(1.0f); 23 / 指定显示的饼图上圆形(false)还椭圆形(true) 24 plot.setCircular(true); 25 / 设置图标题的字体 26 Font font = new Font( 黑体,Font.CENTER_BASELINE,20); 27 TextTitle title = new TextTitle( 项目状态分布); 28 title.setFont(font); 29 chart.setTitle(title); 30 FileOutputStream fos_jpg = null; 31 try 32 fos_jpg=new FileOutputStream(D: 项目状态分布.jpg); 33 ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,640,480,null); 34 fos_jpg.close(); 35 catch (Exception e) 36 37 38 private static PieDataset getDataSet() 39 DefaultPieDataset dataset = new DefaultPieDataset(); 40 dataset.setValue( 市场前期, new Double(10); 41 dataset.setValue( 立项, new Double(15); 42 dataset.setValue( 计划, new Double(10); 43 dataset.setValue( 需求与设计, new Double(10); 44 dataset.setValue( 执行控制, new Double(35); 45 dataset.setValue( 收尾, new Double(10); 46 dataset.setValue( 运维,new Double(10); 47 return dataset; 48 49 2) 采用servlet和struts的action方式输出采用这种方式输出,不用生成图片。A servlet输出Java代码 50 public class PieByServlet extends HttpServlet 51 public void service(ServletRequest req, ServletResponse res) 52 throws ServletException, IOException 53 54 res.setContentType(image/jpeg); 55 PieDataset dataset = getDataSet(); 56 JFreeChart chart = ChartFactory.createPieChart3D( 57 水果饼图, / chart title 58 dataset,/ data 59 true, / include legend 60 true, 61 false ); 62 /设置图表属性 63 / 输出图片 64 ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,800,600,null); 65 B struts的action方式输出只将这条语句加上try catch即可,并返回null。Java代码 66 try 67 ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null); 68 catch (Exception e) 69 70 return null; 其实采用这两种方式与生成图片的方式改动并不大加上语句response.setContentType(image/jpeg);ChartUtilities.writeChartAsJPEG(new FileOutputStream(D: 项目状态分布.jpg);,100,chart,640,480,null);文件流改成response的输出流就可以了hartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);3)jspservletjavabean方式1. Create ChartViewer servletJava代码 71 public class ChartViewer extends HttpServlet 72 public void init() throws ServletException 73 74 /Process the HTTP Get request 75 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 76 / get the chart from session 77 HttpSession session = request.getSession(); 78 BufferedImage chartImage = (BufferedImage) session.getAttribute(chartImage); 79 / set the content type so the browser can see this as a picture 80 response.setContentType(image/png); 81 / send the picture 82 PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9); 83 response.getOutputStream().write(encoder.pngEncode(); 84 85 /Process the HTTP Post request 86 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 87 doGet(request, response); 88 89 /Process the HTTP Put request 90 public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 91 92 /Clean up resources 93 public void destroy() 94 2. Create a servlet map in web.xmlJava代码 95 96 97 98 ChartViewer 99 myapp.webwork.servlets.ChartViewer 100 101 102 ChartViewer 103 /servlet/ChartViewer 104 105 3. Create a chart in a java bean (Pie3DDemo.java)Java代码 106 public class Pie3DDemo 107 private DefaultPieDataset getDataset() 108 / categories. 109 String section = new String Jan,Feb,Mar,Apr,May,Jun, Jul,Aug,Sep,Oct,Nov,Dec ; 110 / data. 111 double data = new doublesection.length; 112 for (int i = 0; i data.length; i+) 113 datai = 10 + (Math.random() * 10); 114 115 / create the dataset. 116 DefaultPieDataset dataset = new DefaultPieDataset(); 117 for (int i = 0; i data.length; i+) 118 dataset.setValue(sectioni, datai); 119 120 return dataset; 121 122 public String getChartViewer(HttpServletRequest request, HttpServletResponse response) 123 DefaultPieDataset dataset = getDataset(); 124 / create the chart. 125 JFreeChart chart = ChartFactory.createPie3DChart( 126 Pie3D Chart Demo, / chart title 127 dataset, / data 128 true, / include legend 129 true, 130 false 131 ); 132 / set the background color for the chart. 133 chart.setBackgroundPaint(Color.cyan); 134 PiePlot plot = (PiePlot) chart.getPlot(); 135 plot.setNoDataMessage(No data available); 136 / set drilldown capability. 137 plot.setURLGenerator(new StandardPieURLGenerator(Bar3DDemo.jsp,section); 138 plot.setLabelGenerator(null); 139 / OPTIONAL CUSTOMISATION COMPLETED. 140 ChartRenderingInfo info = null; 141 HttpSession session = request.getSession(); 142 try 143 /Create RenderingInfo object 144 response.setContentType(text/html); 145 info = new ChartRenderingInfo(new StandardEntityCollection(); 146 BufferedImage chartImage = chart.createBufferedImage(640, 400, info); 147 / putting chart as BufferedImage in session, 148 / thus making it available for the image reading action Action. 149 session.setAttribute(chartImage, chartImage); 150 PrintWriter writer = new PrintWriter(response.getWriter(); 151 ChartUtilities.writeImageMap(writer, imageMap, info); 152 writer.flush(); 153 catch (Exception e) 154 155 String pathInfo = http:/; 156 pathInfo += request.getServerName(); 157 int port = request.getServerPort(); 158 pathInfo += :+String.valueOf(port); 159 pathInfo += request.getContextPath(); 160 String chartViewer = pathInfo + /servlet/ChartViewer; 161 return chartViewer; 162 6. 页面Java代码 163 164 165 166 Pie Chart Demo 167 168 169 170 Pie Chart Demo 171 172 img src= border=0 usemap=#imageMap 173 174 4)采用工具类ChartUtil和DisplayChart(jfreechart的servlet)输出我用了上面的几个方法输出图片,发现页面里只能输出一个图片,不过下面的方法可以输出多个图片,而且是几种方式中最简单的一个,推荐使用。这种方式和上面的三种比较类似,是将javabean里的生成图片的方法写的一个工具类ChartUtil里面。1 添加工具类ChartUtilpublic class ChartUtil / 产生时间序列图,返回图片名称Java代码 175 public static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) 176 177 String filename = null; 178 try 179 if (session != null) 180 181 ChartDeleter deleter = (ChartDeleter)session.getAttribute(JFreeChart_Deleter); 182 session.removeAttribute(JFreeChart_Deleter); 183 session.setAttribute(JFreeChart_Deleter, deleter); 184 185 JFreeChart chart = ChartFactory.createPieChart3D( 186 title, / chart title 187 dataset, / data 188 true, / include legend 189 true, 190 false ); 191 / Write the chart image to the temporary directory 192 ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection(); 193 /If the last parameter is null, the chart is a one time-chart and will be deleted after the first serving. 194 /If the last parameter is a session object, the chart remains until session time out. 195 filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session); 196 / Write the image map to the PrintWriter 197 ChartUtilities.writeImageMap(pw, filename, info,true); 198 pw.flush(); 199 catch (Exception e) 200 System.out.println(Exception - + e.toString(); 201 e.printStackTrace(System.out); 202 filename = picture_error.png; 203 return filename; 204 205 2、在action里统计数据,设置好数据集dataset。传到页面3、 在页面里取出DefaultPieDataset piedataset=(DefaultPieDataset)request.getAttribute(piedataset);/ 用ChartUtil工具类产生图片Java代码 206 String p = ChartUtil.generatePieChart(piedataset, 项目收支线图,500,300,null, new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炸鸡店的品牌推广大片
- 房地产市场趋势与项目管理的应对
- HR招聘压力下的心理调节
- 动漫里的春节奇迹
- 保险公司打折活动方案
- 保险公司策划活动方案
- 保险公司采摘活动方案
- 保险引流活动方案
- 信封折纸活动方案
- 信用卡优惠活动方案
- 工程周转材料管理制度
- 【MOOC期末】《中国文化传承与科技创新》(北京邮电大学)中国慕课期末网课答案
- 江苏省徐州市2023-2024学年八年级下学期期末英语试卷(含答案解析)
- 抽水台班记录表
- 幼儿园绘本故事:《神奇雨伞店》 课件
- DN小原系列座式点焊机使用说明书_图文
- 广东省森林生态系统分布概况综述
- 高效环保铝溶胶项目可行性研究报告写作范文
- 【精品】沟渠整治工程施工方案
- 购房合同[标准版]
- 隧道工程测量毕业设计论文
评论
0/150
提交评论