JfreeChart 及 Cewolf使用笔记

todayword 贡献于2012-03-08

作者 微软用户  创建于2007-11-06 01:18:00   修改者微软用户  修改于2007-11-09 01:59:00字数31640

文档摘要:Cewolf也是开源软件。针对JfreeChart实际使用中易用性不佳的特点重新封装了一层。实际上是以MVC框架的方式提供一个基于JFreeChart 的taglib。 最主要的特点是简化了方法,并提供了自定义的标签对。使得快速开发80%的应用非常便捷。
关键词:

JfreeChart 及 Cewolf使用笔记 一、 简介 JfreeChart(网站http://www.jfree.org/jfreechart/)用来在WEB浏览器中显示图表,主要用来显示统计图。JAVA世界中的开源软件。不用在客户端使用JAVA Applet,是直接使用HTTP协议的二进制流输出到浏览器上。有完整的JavaDoc文档,不过是E文的。详尽的开发手册需要几十美刀购买。因为这个原因,所以可能开发者经常改变其类库,看的版本0.9的一些方法在1.0版本上根本没法用。所以建议最好找适合的版本,而不要一味找最新的版本。 Cewolf也是开源软件。针对JfreeChart实际使用中易用性不佳的特点重新封装了一层。实际上是以MVC框架的方式提供一个基于JFreeChart 的taglib。 最主要的特点是简化了方法,并提供了自定义的标签对。使得快速开发80%的应用非常便捷。 JfreeChart主要功能: l 30多种图形样式 l 通过Dataset接口实现任意数据源的连接 l 帮助提示(Tooltip)、放缩、打印 l 直接导出为JPG/PNG文件 l 通过iText导出为PDF文件(http://www.lowagie.com/iText/) l 通过Batik导出为SVG(http://xml.apache.org/batik/) l 支持Serverlet、JSP(Cewolf)、Applets、Java Application 二、JfreeChart及Cewolf使用 1. 安装 -下载JfreeChart安装包http://sourceforge.net/projects/jfreechart/ -下载Cewolf安装包http://sourceforge.net/projects/cewolf -分别解压缩到临时目录 -拷贝JfreeChart的lib下的JAR文件到本地工程文件夹的WEB-INF的lib下或在IDE的JAR文件引用中导入。必须的有jcommon-1.0.9.jar和jfreechart-1.0.5.jar文件。其余的jar文件的意义可以参考其说明文件。 -拷贝cewolf的lib下的JAR文件到工程中的lib目录。必须的有cewolf-1.0.jar和batik开头的jar文件,包括batik-awt-util-1.6.jar、batik-dom-1.6.jar、batik-svggen-1.6.jar、batik-util-1.6.jar、batik-xml-1.6.jar。其余的jar文件的意义可以参考其说明文件。 -拷贝自定义taglib标签cewolf1.1.tld到WEB-INF目录下 -在WEB-INF\web.xml中修改配置文件,增加红色字体描述的内容。 CewolfServlet de.laures.cewolf.CewolfRenderer 1 …………………………… action *.do ……………………………………… CewolfServlet /cewolf/* ……………………. …………………………. ……………………. ………………….. ………………… ……………………. 2. 测试 在根目录下建立如下pieChart.jsp文件 <%@page contentType="text/html; charset=GB2312"%> <%@taglib uri='/WEB-INF/cewolf.tld' prefix='cewolf' %> <%@page import="java.util.*"%> <%@page import="de.laures.cewolf.*"%> <%@page import="org.jfree.data.*"%> <%@page import="org.jfree.data.time.*"%> <%@page import="org.jfree.chart.tooltips.*"%> <%@page import="org.jfree.chart.*"%> <%@page import="org.jfree.chart.plot.*"%> <% if (pageContext.getAttribute("initFlag") == null) { DatasetProducer pieData = new DatasetProducer() { public Object produceDataset(Map params) { final String[] categories = { "富士苹果", "新奇士橙子","草莓", "西瓜", "香蕉" }; DefaultPieDataset ds = new DefaultPieDataset(); for (int i = 0; i < categories.length; i++) { int y = (int) (Math.random() * 10 + 1); ds.setValue(categories[i], new Integer(y)); } return ds; } public String getProducerId() { return "PieDataProducer"; } public boolean hasExpired(Map params, Date since) { return false; } }; pageContext.setAttribute("pieData", pieData); PieToolTipGenerator pieTG = new PieToolTipGenerator() { public String generateToolTip(PieDataset dataset, Comparable section, int index) { return String.valueOf(index); } }; pageContext.setAttribute("pieToolTipGenerator", pieTG); } %>

Cewolf饼图演示

本人日常水果消费比例图
启动Tomcat 根据实际情况在浏览器地址栏上输入如下路径 http://localhost:8080/cewolf/pieChart.jsp 如果看到如下图形,则成功。如没有显示,检查前面安装步骤是否正确。JDK是否已经安装。环境变量是否正确设置。Tomcat是否正确安装,是否启动,端口号是否正确。 3. 初步使用 3.1概念 数据集。 这里只说最经常的提供数据集的方法。就是数据库提供的数据集。其它类型的参考Javadoc即可。我这里使用的是iBatis的DAO方法从数据库读取相应记录集,运算后转换为数组。传递这些数组参数作为数据集。 数据集的格式必须和数据集的类型相匹配。例如分类类型的是不能作为甘特图类型的数据集的。否则会报错。 数据集类型主要有以下几种: v 分类数据集CategoryDataset 该种数据集类型是分类统计的数据集类型。横坐标值是等间隔的。 v XY数据集XYDataset 该种数据集类型是以XY坐标表示的数据集类型。横纵坐标值是不等间隔的。 v 饼图数据集PieDataset 该种数据集类型是饼图统计的数据集类型。显示模式非直角坐标系。 v 其它数据集 符合甘特图、温度图等特殊显示类型所需要的数据集。 对象。 首先可以把整个图形视为对象,按照OO的方式进行开发。这是与客户端使用VML或者JavaScript绘制图形的一个重要差别。此处按照实际最常用的方式介绍一下该对象树,详细的请参考JavaDoc。 Plot数据区对象是每次都要用到的对象,表示整个绘图对象。 v DomainAxis对象是横坐标轴对象。 v RangeAxis对象是纵坐标轴对象。 v Legend对象是图例对象。 v AxisLine对象是坐标轴的刻度线对象。 v TickLable对象是坐标轴上的文字对象。 v TickUnit对象是坐标轴单位对象。 v Gridlines对象是绘图区网格线对象。 v Renderer对象是绘图渲染器对象。 v Dataset对象是数据集对象。 v LinkGenerator对象是值元素链接对象。 v ToolTipGenerator对象是提示帮助对象。 这些对象应该能满足90%以上的需求,其它的可以参考JavaDoc。 方法 Cewolfe封装后。仅需完成Dataset数据集数据的输入即可在JSP上使用标签显示出来。其他方法见以下介绍。 v DatasetProducer对象ProduceDataset方法 核心方法,必须完成。将需要的数据集类型的数据传递给该方法。一般为数组。 v DatasetProducer对象getProducerId方法 设定该DatasetProducer对象的ID,在多个对象实例时有用。一般不用。 v DatasetProducer对象hasExpired方法 设定绘图缓冲区何时超时。可以设定一个值,比如5秒。一般不用。 v LinkGenrator对象generateLink方法 要将显示值与浏览器客户端交互使用本方法。一般利用JavaScript传递值到客户端。可以配合客户端DIV动效窗口显示。 v CategoryTooltip/XYTooltip对象的generateToolTip方法 需要显示提示帮助时,使用本方法。此方法在客户端使用ALT标签来显示值。一般都要加上,否则需要知道精确数据的时候无法直接看到。 v ChartPostProcessor对象的processChart方法 需要自定义绘图对象的各种属性和方法时,使用本方法。非常重要。因为每种类型的统计图几乎都需要Jfreechart进行自定义。Map参数接受JSP中taglib传递过来的参数。 交互 v JSP->Action JSP文件中,通过标签对传递参数到Action中进行处理。 JSP标签使用 以上例子共传递6个参数。 Action中获得这6个参数并进行处理。 for (int i = 0; i < params.size(); i++) { //这里的params 是通过标签输入的! String colorStr = (String) params.get(String.valueOf(i)); plot.getRenderer().setSeriesPaint(i,Color.decode(colorStr)); } v Action->JSP 利用前面所述的LinkGenrator对象generateLink方法 Action中处理返回JavaScript的getit函数字符串 public String generateLink(Object data, int series, Object item) { String dsName=seriesNames[series]; DefaultIntervalCategoryDataset ds=((DefaultIntervalCategoryDataset)data); Comparable iStr=((Comparable)item); int cata = ds.getCategoryIndex(iStr); String specValue=ds.getEndValue(series,cata).toString(); String specStr="预测指标" +dsName+":

    里程" +iStr.toString()+"的值为"+specValue; return "javascript:getit('"+specStr+"')"; } JSP中对getit()函数进行处理 3.2 实例说明 通过一个实际的例子详细说明整个的操作流程。 首先是通过MVC的Struts说明两个JSP页面和Action的关系 Step_situ.jsp 输入参数页面 AnlysSituAction 根据参数实现绘图 Anlys_situ.jsp 输出结果页面,使用Cewolf的taglib Input Redirect Step_situ.jsp <%@ page contentType="text/html; charset=GBK"%> 设定头类型和字符集GBK <%@taglib uri='http://cewolf.sourceforge.net/taglib/cewolf.tld' prefix='cewolf' %> 设定cewolf的标签库路径和前缀 <%@ taglib uri="http://www.casw.com" prefix="casw"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> 设定Struts的标签库路径和前缀 …………………………………… ………………… Action的指向 ………………… ………………….. Form表单,输入的值作为参数 AnlysSituAction package com.casw.highway.im.struts.road.analyse; 包名 import ……; 导入相关的程序包,使用IDE的Ctrl+Shift+O自动处理 public class AnlysSituAction extends Action { public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { SituForm form = (SituForm)actionForm; 获得Form表单Bean,MVC中的Model层 SituDao situDao = (SituDao)DaoConfig.getDaoManager().getDao(SituDao.class); RoadlineDao rdDao = (RoadlineDao)DaoConfig.getDaoManager().getDao(RoadlineDao.class); Roadline rd = rdDao.getRoadLine(form.getRoadId()); 获取DAO try{ //设置根据RoadID取得的路线属性到Request对象中,在JSP上显示 Util.setRoadProperty2JSP(rd, request); int startCaculatePoint =0; int endCaculatePoint = (int)Float.parseFloat(rd.getLength())*1000; //生成分类数据 里程范围,横轴 if((!form.getStartMile().equals(""))&&(!form.getEndMile().equals(""))){ startCaculatePoint = (int) Float.parseFloat(form.getStartMile()); endCaculatePoint = (int) Float.parseFloat(form.getEndMile()); } final int stRange=startCaculatePoint; final int edRange=endCaculatePoint; final String full=request.getParameter("full"); int unit=Integer.parseInt(form.getMileUnit()); final int CaculateSize=(endCaculatePoint-startCaculatePoint)/unit+1; //可自定义显示角度。若由于横坐标太多导致的Label显示问题的解决方法 //参看http://topic.csdn.net/t/20060328/12/4645205.html final double angle; if(CaculateSize>16){ angle=45; //横坐标有16个以上分类,则分类轴文字旋转45度 }else if(CaculateSize>24){ angle=90; }else{ angle=0; } final String[] categories = new String[CaculateSize]; final String[] categoriesCacu = new String[CaculateSize]; //构建分类数组 for(int i=0;i 5000; } }; 绘图缓冲区超过5秒钟清空 this.getServlet().getServletContext().setAttribute("timeData", timeData); 通过serverlet的context设定传递到JSP上 LinkGenerator xyLG = new CategoryItemLinkGenerator(){ public String generateLink(Object data, int series, Object item) { String specName=seriesNames[series]; DefaultIntervalCategoryDataset ds=((DefaultIntervalCategoryDataset)data); Comparable iStr=((Comparable)item); int cata = ds.getCategoryIndex(iStr); String specValue=ds.getEndValue(series,cata).toString(); String specStr="指标"+specName+":

    " +iStr.toString()+"段加权平均值为"+specValue; return "javascript:getit('"+specStr+"')"; 通过Javascript的getit方法传递参数到JSP页面上 } }; this.getServlet().getServletContext().setAttribute("categoryLinkGenerator", xyLG); CategoryToolTipGenerator catTG = new CategoryToolTipGenerator() { public String generateToolTip(CategoryDataset dataset, int series, int index) { return String.valueOf(dataset.getValue(series, index)); 生成页面上值的提示帮助Tooltip } }; this.getServlet().getServletContext().setAttribute("categoryTooltipGenerator", catTG); ChartPostProcessor dataColor = new ChartPostProcessor() { public void processChart(Object chart, Map params) { CategoryPlot plot = (CategoryPlot) ((JFreeChart) chart).getPlot(); 获得Plot对象 plot.setBackgroundPaint(Color.decode("#fcfcfc")); 设置整体的背景色 plot.setDomainGridlinePaint(Color.decode("#cccccc")); 横坐标网格线灰色 plot.setDomainGridlinesVisible(true); 设置横坐标网格线为可见 plot.setRangeGridlinePaint(Color.BLACK); 设置纵坐标网格线为黑色 plot.getDomainAxis().setCategoryLabelPositions( CategoryLabelPositions.createDownRotationLabelPositions(angle*Math.PI/180)); 设置横坐标Label旋转角度,一般为45度或90度角,这样可以处理坐标轴文字较长产生重叠的问题 Font myFont = new Font("楷体",Font.TRUETYPE_FONT,12); Font myFont2 = new Font("Times New Roman",Font.TRUETYPE_FONT,12); 生成字体类型 plot.getDomainAxis().setLabelFont(myFont); 设置横坐标标题字的字体 plot.getDomainAxis().setTickLabelFont(myFont2); 设置横坐标刻度标题字的字体 plot.getRangeAxis().setLabelFont(myFont); 设置纵坐标标题字的字体 plot.getRangeAxis().setUpperMargin(0.15); plot.getRangeAxis().setLowerMargin(0.15); 设置纵坐标的上下留空边距 plot.getRangeAxis().setRange(0, 100); 设置纵轴的显示范围 if((CaculateSize>40)&&(full==null)){ plot.setDomainGridlinesVisible(false); 分类太多时去掉网格线,否则涂成一片 plot.getDomainAxis().setAxisLineVisible(false); 去掉刻度线 plot.getDomainAxis().setTickLabelsVisible(false); 去掉刻度线旁文字 } plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45); 直接设置横坐标Label旋转角度为45度 for (int i = 0; i < params.size(); i++) { //这里的params 是通过标签输入的! String colorStr = (String) params.get(String.valueOf(i)); plot.getRenderer().setSeriesPaint(i,Color.decode(colorStr)); } } }; 标签输入参数设定不同分类的颜色 this.getServlet().getServletContext().setAttribute("dataColor", dataColor); if(full==null){ return actionMapping.findForward("situOK"); }else{ return new ActionForward(actionMapping.findForward("situFullOK") .getPath()+"?range="+ Math.ceil((edRange-stRange)/1000) , false); } 根据不同参数跳转不同的JSP页面 }catch(Exception e){ e.printStackTrace(); return actionMapping.getInputForward(); } } } Anlys_situ.jsp <%@ page contentType="text/html; charset=GBK"%> <%@ taglib uri='http://cewolf.sourceforge.net/taglib/cewolf.tld' prefix='cewolf' %> <%@ taglib uri="http://www.casw.com" prefix="casw"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> AJAX DOJO框架引用 使用DOJO的Dialog控件和Button控件 根据cewolf返回的a值,使用DHTML动态显示出内容,完成用户点击值区域,渐显半透明对话框,显示点击处的详细值内容。 DOJO初始化,注意ID值dialog0和hider0 ……………………… Chart表明是普通的绘图方式,id名称,title是图上的标题字,type是绘图类型,此处是EL表达式,值是step_situ.jsp传递过来的值。Xaxislabel是横坐标标题,yaxislable是纵坐标标题。 底色使用渐变色。从0,0点的白色到300,500点的灰色。也可以用单色,也可以用图片来替代等。 数据集的id 向Action传递的参数值。此处传递的颜色值。 渲染器路径及图片的长宽 图片上的链接及帮助提示的id ……………………
DOJO对话框的参数。Dojotype是dojo控件类型是对话框。Id值,背景色。BgOpacity是透明度,0.5代表50%的透明度。Toggle表示显示类型,fade表示渐淡显示。ToggleDuration表示渐淡显示到全部显示的时间,单位毫秒。Lifetime表示对话框持续显示的时间,单位毫秒,超过该时间,自动消失。 使用DHTML的滤镜显示对话框外的阴影立体显示 关闭按钮,DOJO的BUTTON控件
DHTML的滤镜显示垂直渐变色在对话框标题栏 [X]
实际结果图如下: 3. 高阶使用 3.1 概念 绘图方式。 前面初级使用使用的是普通绘图方式,这也是最经常使用的绘图方式。可是面对其他的一些需求可能会出现一些困难。这就需要其他的绘图方式。其基础还是普通的绘图方式,但会有一些特殊的地方需要明确。 v 普通绘图方式 基础的绘图方式,较简单的绘图方式,能够满足大多数的需求。 v Overlay绘图方式 在同一个绘图区,以两种或两种以上的数据集和绘图类型进行叠加渲染。例如A类数据以折线类型,B类数据以柱状图类型同时显示。共用相同的横纵坐标。 v 联合(Combined)绘图方式 在同一个绘图区,以两种或两种以上的数据集和绘图类型进行分离渲染。独立的横纵坐标。但是横坐标单位、分隔方式等完全相同,逻辑上可视为相同的横坐标。 3.2 实例解说 Overlay绘图方式的例子,仅保留相关部分,其他省略,其他部分参考普通绘图方式的例子。与普通绘图方式不同的地方用红色标出。本例子绘制了两个不同的数据集,并在一个绘图区显示出来。 Action部分 package com.casw.highway.im.struts.road.analyse; import ……; public class AnlysStructAction extends Action { public ActionForward execute(……) { ……………… try{ ……………… DatasetProducer timeData = new DatasetProducer() { public Object produceDataset(Map params) {……} public String getProducerId() { return "TimeDataProducer"; } public boolean hasExpired(Map params, Date since) {……} }; 第一个数据集。与普通数据集相同。需要注意的是DatasetProducer的对象实例不同,名称不同,其Producer ID不同。 this.getServlet().getServletContext().setAttribute("timeData", timeData); DatasetProducer materialData = new DatasetProducer() { public Object produceDataset(Map params) {……} public String getProducerId() { return "LayerDataProducer"; } public boolean hasExpired(Map params, Date since) {……} }; 第二个数据集。 this.getServlet().getServletContext().setAttribute("materialData", materialData); LinkGenerator xyLG = new XYItemLinkGenerator(){ public String generateLink(Object data, int series, int item) { String specName=""; String specStr=""; if(series:

  " +"第"+item+"段 "+stFormatValueStr+" ~ "+edFormatValueStr+ "
 加权平均值为"+yValue; } return "javascript:getit('"+specStr+"')"; } }; this.getServlet().getServletContext().setAttribute("xyLinkGenerator", xyLG); //XY类型的帮助提示(Tooltip) …… ChartPostProcessor dataColor = new ChartPostProcessor() { public void processChart(Object chart, Map params) { XYPlot plot = (XYPlot) ((JFreeChart) chart).getPlot(); …… 此处Plot因为是使用同一个数据区,所以和普通的一样。 } }; this.getServlet().getServletContext().setAttribute("dataColor", dataColor); return actionMapping.findForward("structOK"); }catch(Exception e){ e.printStackTrace(); return actionMapping.getInputForward(); } } } JSP部分 方式必须是overlaidchart。类型为overlaidxy且只能是。xaixtype为x轴类型,可以有三种,数字类型、文本类型、日期类型,此处是数字类型。Yaxistype为y轴类型。 实际结果图如下: 联合绘图方式的例子,仅保留相关部分,其他省略,其他部分参考普通绘图方式的例子。与普通绘图方式不同的地方用红色标出。本例子绘制了三个不同的数据集,并在一个绘图区显示出来。 Action部分 package com.casw.highway.im.struts.road.policy; import ……; public class pyBudgetDetailAction extends Action { public ActionForward execute(……) { ……………………… try{ ……………………… DatasetProducer specData = new DatasetProducer() { public Object produceDataset(Map params) { ……………………… } public String getProducerId() { return "TimeDataProducer"; } public boolean hasExpired(Map params, Date since) { return (System.currentTimeMillis() - since.getTime()) > 5000; } }; 第一个数据集。与普通数据集相同。需要注意的是DatasetProducer的对象实例不同,名称不同,其Producer ID不同。 this.getServlet().getServletContext().setAttribute("specData", specData); 传递到JSP,设置的Attribute三者一定不能相同。 DatasetProducer tfcData = new DatasetProducer() { public Object produceDataset(Map params) {…} public String getProducerId() { return "TfcDataProducer"; } public boolean hasExpired(Map params, Date since) {…} }; this.getServlet().getServletContext().setAttribute("tfcData", tfcData); 第二个数据集。注意与第一个不同的地方 DatasetProducer feeData = new DatasetProducer() { public Object produceDataset(Map params) {…} public String getProducerId() { return "FeeDataProducer"; } public boolean hasExpired(Map params, Date since) {…} }; this.getServlet().getServletContext().setAttribute("feeData", feeData); 第三个数据集。 LinkGenerator xyLG = new XYItemLinkGenerator(){ public String generateLink(Object data, int series, int item) { String specStr=""; XYSeriesCollection ds=((XYSeriesCollection)data); Number xValue = ds.getSeries(series).getDataItem(item).getX(); Number yValue = ds.getSeries(series).getDataItem(item).getY(); String name=ds.getSeries(series).getKey().toString(); specStr=name+"预测指标/交通量/养护费用:

  " +"预测第"+item+"年 即"+xValue+" 年"+"
  "+name+"的值为"+yValue; return "javascript:getit('"+specStr+"')"; } }; this.getServlet().getServletContext().setAttribute("xyLinkGenerator", xyLG); Link生成方式,参考与普通不一样的地方,因为现在有三种不同类型的数据集,因此要正确显示。 XYToolTipGenerator catTG = new XYToolTipGenerator() { public String generateToolTip(XYDataset dataset, int series, int index) { return String.valueOf(dataset.getY(series, index)); } }; this.getServlet().getServletContext().setAttribute("xyTooltipGenerator", catTG); Tooltip生成方式。与普通的一样 ChartPostProcessor dataColor = new ChartPostProcessor() { public void processChart(Object chart, Map params) { CombinedDomainXYPlot plot = (CombinedDomainXYPlot) ((JFreeChart) chart).getPlot(); 最重要的部分。此处获得的plot类型是CombinedDomainXYPlot,也就是全部数据Plot List listSubplots = plot.getSubplots(); XYPlot specPlot = ((XYPlot)listSubplots.get(0)); XYPlot tfcPlot = ((XYPlot)listSubplots.get(1)); 获得子数据区。从列表中获得任意的子数据区。数据区间隔可以设置。此处分别获得指标plot和交通量plot //格式化横坐标显示样式 Date2AxisYearFormat formatter= new Date2AxisYearFormat(); ((DateAxis)plot.getDomainAxis()).setDateFormatOverride(formatter); 格式化横坐标显示样式。这里可能是一个BUG。因为缺省是DATE类型的横坐标类型。 Font myFont = new Font("楷体",Font.TRUETYPE_FONT,12); Font myFont2 = new Font("Times New Roman",Font.TRUETYPE_FONT,12); plot.getDomainAxis().setLabelFont(myFont); plot.getDomainAxis().setTickLabelFont(myFont2); 设置字体 } } }; return actionMapping.findForward("bgdetailOK"); }catch(Exception e){ e.printStackTrace(); return actionMapping.getInputForward(); } } } JSP部分 这里的第一个标签必须是combinedchart。Layout表示多个图如何排列,共水平、垂直两种方式,此处是垂直方式。绘图类型是combinedxy且只能是,所以分类或者其他数据类型必须转换为XY类型的。 子数据区。排列顺序也是显示顺序。Id值传递相应的数据。 实际结果图如下: 因为cewolf是将渲染后图片以二进制流的格式输出到浏览器上。对于可能需要将生成的图片另存为文件的形式,使用cewolf的方法目前是不行的,只能使用Jfreechart的方法。如下所示。我是在使用POI嵌入EXCEL统计图用到的此部分。 首先应完成数据集Dataset实例,将数据填充。此处是DefaultCategoryDataset JFreeChart chart = ChartFactory.createBarChart3D(name,"年份","费用", data,PlotOrientation.VERTICAL,true,true,true); 调用的Jfreechart的工厂类生成需要的图片文件参数 try{ ChartUtilities.saveChartAsJPEG(new File(path+img),1,chart,580,440); }catch (IOException e) { System.out.print("....Can not Create image File ..."+path+img); } 调用保存为JPG或PNG的方法进行图片的保存,必须加入TRY..CATCH块进行错误处理。 4. 尚待解决的一些问题 因为使用过程中再更进一步高阶使用,由于时间的缘故没有透彻研究。因此留下一些想解决而没有解决的问题,留待以后得出了。 双纵坐标轴的问题。有些图形例如Overlay图形样式有两个数据集,这两个数据集的纵坐标轴标尺不同,单位不同,所以最好的方式是在右侧多一个坐标轴。 渲染图型尺寸的问题。过大的渲染尺寸虽然不会导致直接错误,但是出来的图是有问题的,无图形,且尺寸变很小。具体的值没有具体测试,但是应该不能超过10,000像素。一般控制为屏幕大小的尺寸还是没有问题的。 报表工具该研发团队也有一个产品,不过很少见有人用。共用Jcommon.jar包。 打印控制Jfreechart有此特性,但没有具体使用过,不知道实际效果如何。 图表样式对应一般的统计需求应该是绰绰有余,不过一些特殊形式的图表样式与大型商用产品相比还是有一些差距。 有什么问题请来电子邮件联系:刘继恩 liujien@hotmail.com 2007-11-5 5. 参考 附录A:相关资料 1,使用 JFreeChart来创建基于web的图表 http://www-900.ibm.com/developerWorks/cn/java/l-jfreechart/index.shtml?ca=dwcn-isc&me=ccid 2,JfreeChart网站 : http://www.jfree.org/jfreechart/index.html http://sourceforge.net/projects/jfreechart/ 3,CeWolf网站: http://cewolf.sourceforge.net/ 附录B CeWolf 标签库 Cewolf Tag Library (0.9.3) 红色为必须的参数。 The plot tag定义plot数据层实例 属 性 type Plot类型,有xyarea, xyline, xyshapesandlines , scatter, xyverticalbar, step, candlestick, highlow, signal, verticlebar, area, line, shapesandlines rtexprvalue=true xaxislabel plot x轴标题. 该属性仅在横向的联合(combined)图表中使用。 rtexprvalue=true yaxislabel plot y轴标题. 该属性仅在垂直的联合(combined)图表中使用。 rtexprvalue=true 子选项标签: This tag is a specialized HTML img tag. It renders the chart which has been specified by a tag in the same page. map 属 性 renderer servlet渲染路径. 任何起始为'/'的路径指向源,该源依赖于web应用的root. 否则是绝对路径。 rtexprvalue=true chartid 图形id rtexprvalue=true width 渲染图宽度,单位:像素. required=true rtexprvalue=true height 渲染图高度,单位:像素. rtexprvalue=true mime 图形文件 MIME类型.值为image/png (缺省) 和 image/svg 。 rtexprvalue=true alt 和HMTL标签 属性相同. rtexprvalue=true hspace vspace align border ismap longdesc usemap class dir lang onclick ondbclick onkeydown onkeypress onkeyup onmousedown onmousemove onmouseout onmouseover onmouseup style htmltitle 此标签通常在HTML的img标签的src属性中应用。例如: 此URL作为页面的字符串属性 属 性 Var URL页面范围属性的名称. If not specified the URL is printed to the page outstream. rtexprvalue=true renderer servlet渲染路径. 任何起始为'/'的路径指向源,该源依赖于web应用的root. 否则是绝对路径。 rtexprvalue=true chartid 图形id. rtexprvalue=true width 图片宽度,单位:像素. rtexprvalue=true height 图片高度,单位:像素。 rtexprvalue=true mime 图形文件 MIME类型.值为image/png (缺省) 和 image/svg 。 rtexprvalue=true 子选项标签: 图形描述的根标签. 数据由chartpostprocessor提供。 属 性 id ID存储bean在此页面 ,由img标签发现。 使用 ID避免其他beans引起的编译错误。 rtexprvalue=true type 绘图类型. 有area, areaxy, horizontalbar, horizontalbar3d, line, pie, scatter, stackedhorizontalbar, stackedverticalbar, stackedverticalbar3d, timeseries, verticalbar, verticalbar3d, xy, candlestick, highlow, gantt, wind, signal, verticalxybar, pie3d rtexprvalue=true title 图形上方的标题. rtexprvalue=true xaxislabel 图形x轴的标题. 如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true yaxislabel 图形y轴的标题. 如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true background 背景图.值是文件名,路径根据web应用的根目录 (例如 /WEB-INF/img/bg.jpg). 缺省必须由JVM的serverlet容器 java.awt.Toolkit 载入此图 rtexprvalue=true backgroundimagealpha 背景图的不透明值,float类型。 值范围 从0.0到 1.0. 缺省是0.0 rtexprvalue=true antialias 反混叠。会圆滑图线文字,否则会锐利有锯齿。缺省是真。 rtexprvalue=true showlegend 布尔值。转换on或off 决定是否显示图例。缺省是真 rtexprvalue=true legendanchor 设置图例内面板的锚点。值:'north', 'south', 'west', 'east'.如果showlegned是 'false'则忽略. 缺省值是 'south' rtexprvalue=true 子选项标签: overlaid图形描述的根标签. 数据由chartpostprocessor提供。 属 性 id ID存储bean在此页面 ,由img标签发现。 使用 ID避免其他beans引起的编译错误。 rtexprvalue=true type 绘图类型.本版本仅支持overlaidxy. rtexprvalue=true title 图形标题. rtexprvalue=true xaxistype 横坐标类型. 值: date, number rtexprvalue=true xaxislabel 横坐标标题。如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true yaxistype 纵坐标类型. 值: date, number rtexprvalue=true yaxislabel 纵坐标标题。如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true background 背景图.值是文件名,路径根据web应用的根目录 (例如 /WEB-INF/img/bg.jpg). 缺省必须由JVM的serverlet容器 java.awt.Toolkit 载入此图 rtexprvalue=true backgroundimagealpha 背景图的不透明值,float类型。 值范围 从0.0到 1.0. 缺省是0.0 rtexprvalue=true antialias 反混叠。会圆滑图线文字,否则会锐利有锯齿。缺省是真。 rtexprvalue=true showlegend 布尔值。转换on或off 决定是否显示图例。缺省是真 rtexprvalue=true legendanchor 设置图例内面板的锚点。值:'north', 'south', 'west', 'east'.如果showlegned是 'false'则忽略. 缺省值是 'south' rtexprvalue=true 子选项标签: 联合(combined)图形描述的根标签. 数据由chartpostprocessor提供。 属 性 id ID存储bean在此页面 ,由img标签发现。 使用 ID避免其他beans引起的编译错误。 rtexprvalue=true type 绘图类型。目前版本只能是combinedxy rtexprvalue=true layout 图形排列方式. Vertical或者horizontal rtexprvalue=true title 图形上方的标题. rtexprvalue=true xaxislabel 横坐标标题。如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true yaxislabel 纵坐标标题。如果chart标签是pie3d或pie的话 忽略此属性. rtexprvalue=true background 背景图.值是文件名,路径根据web应用的根目录 (例如 /WEB-INF/img/bg.jpg). 缺省必须由JVM的serverlet容器 java.awt.Toolkit 载入此图 rtexprvalue=true backgroundimagealpha 背景图的不透明值,float类型。 值范围 从0.0到 1.0. 缺省是0.0 rtexprvalue=true antialias 反混叠。会圆滑图线文字,否则会锐利有锯齿。缺省是真。 rtexprvalue=true showlegend 布尔值。转换on或off 决定是否显示图例。缺省是真 rtexprvalue=true legendanchor 设置图例内面板的锚点。值:'north', 'south', 'west', 'east'.如果showlegned是 'false'则忽略. 缺省值是 'south' rtexprvalue=true 此标签用来渲染图例作为一个分离的图片. It assumes that somewhere else in the JSP a chart tag defines a chart with the same ID as this legend tag. 属 性 renderer 渲染器servlet路径,与web应用根URL相关 (例如 servlet/cewolf). rtexprvalue=true Id ID存储bean在此页面的Session中 ,由渲染器Serverlet发现。 使用 ID避免其他Session引起的互相覆盖。 rtexprvalue=true Width 和HMTL标签 属性相同. rtexprvalue=true Height Mime 图形文件 MIME类型.值为image/png (缺省) 和 image/svg 。 rtexprvalue=true Alt 和HMTL标签 属性相同. rtexprvalue=true Hspace Vspace Align Border ismap Longdesc Usemap Class Dir Lang Onclick Ondbclick Onkeydown Onkeypress Onkeyup onmousedown onmousemove onmouseout onmouseover Onmouseup style htmltitle optional childs: A data tag provides all information needed to retrieve the data which are needed by the chart. Current version only supports data provided by a DatasetProducer. In future versions there will be tags to provide data from a datasource (e.g. via SQL). producer optional childs: A data tag provides all information needed to retrieve the data which are needed by the chart. Current version only supports data provided by a DatasetProducer. In future versions there will be tags to provide data from a datasource (e.g. via SQL). param 属 性 id DatasetProducer类型的ID,由pageContext发现. 次对象获取图形的数据集. rtexprvalue=true usecache 决定是否使用Cache缓冲。缺省为真。 rtexprvalue=true optional childs: A chart postprocessor tag references an object of type ChartProstProcessor which must be defined in pageContext under the provided ID. This object is called back after chart generation to post process the chart in any manner. param 属 性 id ChartPostProcessor类型的ID,由pageContext发现.此对象用来处理渲染后的图形. rtexprvalue=true Name/value对传递参数,需要有接口来处理。 属 性 name 参数名称 rtexprvalue=true value 参数值. 必须串行化. type=java.io.Serializable rtexprvalue=true The gradientpaint tag provides a way to fill a shape with a linear color gradient pattern. If Point P1 with Color C1 and Point P2 with Color C2 are specified in user space, the Color on the P1, P2 connecting line is proportionally changed from C1 to C2. Any point P not on the extended P1, P2 connecting line has the color of the point P' that is the perpendicular projection of P on the extended P1, P2 connecting line. Points on the extended line outside of the P1, P2 segment can be colored in one of two ways.
  • If the gradient is cyclic then the points on the extended P1, P2 connecting line cycle back and forth between the colors C1 and C2.
  • If the gradient is acyclic then points on the P1 side of the segment have the constant Color C1 while points on the P2 side have the constant Color C2. The two colors are defined in a nested point tag of this tag. point 属 性 cyclic 在两种颜色C1 和C2之间循环渐变. 缺省为假 rtexprvalue=true Defines a point with x and y coordinates and a color. colorpaint 属 性 x X点坐标. rtexprvalue=true y Y点坐标. rtexprvalue=true color required=false rtexprvalue=true Fills the area defined by the parent tag with a color. 属 性 color 此颜色用来填充父标签区域.颜色定义与HTML兼容如黑色是'#000000' ,红色是'#FF0000'.附加两种16进制数字作为Alpha通道。因此 '#FF000080' 是不透明度为50%的红色. rtexprvalue=true The texturepaint tag provides a way to fill the area of the parent tag with a texture that is specified as an image. The texture is anchored to the upper left corner of the parent tags area. 属 性 image 图形材质.值是图形文件的文件名,路径相对于web应用的根目录 (如 /WEB-INF/img/bg.jpg). 缺省必须由JVM的serverlet容器 java.awt.Toolkit 载入此图 rtexprvalue=true width 材质宽度 rtexprvalue=true height 材质高度 rtexprvalue=true This tag defines an image and tooltip map for the parent img tag. img 属 性 linkgeneratorid de.laures.cewolf.LinkGenerator类生成的id. rtexprvalue=true tooltipgeneratorid com.jrefinery.chart.tooltips.ToolTipGenerator类生成的id. rtexprvalue=true

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 3 人已下载

下载文档