﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-TNT blog-文章分类-REPORT</title><link>http://www.blogjava.net/terrywu/category/11704.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 Mar 2007 11:23:24 GMT</lastBuildDate><pubDate>Fri, 23 Mar 2007 11:23:24 GMT</pubDate><ttl>60</ttl><item><title>jfreecahrt1.0 中文API </title><link>http://www.blogjava.net/terrywu/articles/105618.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Thu, 22 Mar 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/105618.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/105618.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/105618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/105618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/105618.html</trackback:ping><description><![CDATA[jfreechart<br /><br /><br />jfreechart目前最高版本为1.0.0版(http://www.jfree.org/jfreechart/index.html)。可以绘制<br />pie charts 饼图,bar charts 柱状图,line and area charts曲线图,scatter plots and bubble charts 散列图,time series 时序图,Area Charts区域图,Difference Chart差异图,Step Chart步骤图,Multiple Axis Charts 混合图,Gantt charts甘特图，combination charts 复合图<br />JFreeChart核心类库介绍：<br />jfreechart主要由两个大的包组成：org.jfree.chart,org.jfree.data。其中前者主要与图形<br />本身有关，后者与图形显示的数据有关。<br />核心类主要有：<br />org.jfree.chart.JFreeChart：图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象<br />org.jfree.data.category.XXXDataSet:数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类<br />org.jfree.chart.plot.XXXPlot：图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持<br />org.jfree.chart.axis.XXXAxis：用于处理图表的两个轴：纵轴和横轴<br />org.jfree.chart.render.XXXRender：负责如何显示一个图表对象<br />org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接<br />XXXXXToolTipGenerator:用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类<br />对于常用的饼图阖柱状图，比较简单而且网上有很多的文章介绍，在这里就不再一一复述了，<br />(可以参考这篇文章http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc&amp;me=ccid）<br />主要说明下另一种常见的报表，时序图，首先声明一个曲线数据集合对象和曲线对象<br /><br />TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();<br />//声明具体是曲线对象，(可根据实际情况在同一张图中显示多条曲线进行数据比对，根据实际应用情况当超过4条曲线时，就会有些乱。)<br />TimePeriodValues timeperiod1 = new TimePeriodValues("服务器A在线用户数量");<br />TimePeriodValues timeperiod2 = new TimePeriodValues("服务器B在线用户数量");<br />我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();<br />TimeSeries ts = new TimeSeries();<br />在生成数据集时（ts.add(new Day(day, month, year),10))）只能生成最小单位为天的横轴所以改用了TimePeriodValuesCollection <br />//根据当前时间取得横轴坐标，时间间隔为1小时<br />Calendar cal = Calendar.getInstance();<br />int year = cal.get(Calendar.YEAR);<br />int month = cal.get(Calendar.MONTH) + 1;<br />int day = cal.get(Calendar.DAY_OF_MONTH);<br />//这里改为根据自己程序得到的需要显示的时间点和对应的数据的集合;<br />List objectList1 = dao.getList1();<br />List objectList2 = dao.getList2();<br />//使用循环，把x轴，y轴的值赋给timeseries1<br />for (int i =0;i&lt;objecthash1.size();i++) {<br />    int hour = objecthash1[i].getHours();<br />    int count = objecthash1[i].getCount();<br /> //将每一对数据（时间，数值）添加到数据集合1(曲线对象1)中<br />    timeseries1.add(new Hour(hour, day, month, year),count);<br />}<br />for (int i =0;i&lt;objecthash2.size();i++) {<br />    int hour = objecthash2[i].getHours();<br />    int count = objecthash2[i].getCount();<br /> //将每一对数据（时间，数值）添加到数据集合2(曲线对象2)中<br />    timeseries2.add(new Hour(hour, day, month, year),count);<br />}<br />//将曲线对象添加到曲线数据集合对象中<br />timeseriescollection.addSeries(timeseries1);<br />timeseriescollection.addSeries(timeseries2);<br />//绘制报表<br />String title = "日在线用户统计"; //报表标题<br />String domain = "时间";    //x轴<br />String range = "用户在线数量";   //y轴<br />//创建时间序列图对象<br />JFreeChart chart = ChartFactory.createTimeSeriesChart(<br />title,  //报表标题<br />domain, //报表横轴标签<br />range,  //报表纵轴标签<br />timeseriescollection, //数据集合<br />true,  //是否显示图例,在这里如果为true则会在图表的下方显示各条数据曲线的名称和颜色<br />false, // 是否生成工具<br />false   // 是否生成URL链接);<br />//将报表保存为jpg文件<br />ChartUtilities.saveChartAsJPEG(file, //文件保存物理路径包括路径和文件名<br />100,   //图片质量<br />chart, //图表对象<br />1024,  //图像宽度<br />768,   //图像高度<br />null); //显示信息<br />//将报表直接在页面输出<br />ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);<br /><br />String title="月在线用户统计";  //标题<br />String domain="时间(天)";//x轴<br />String range="用户在线数量";//y轴 <br />TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();<br />TimePeriodValues timeseries = new TimePeriodValues( "用户数量");<br /> timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);<br /> timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);<br /> timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);<br /> timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);<br />JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);<br />当我们生成了一个报表对象时，可能需要根据实际情况来决定报表的横轴和纵轴的数值间隔，显示方式等。<br />可以用XYPlot xyplot = (XYPlot)chart.getPlot();来得到所有数据点的集合。（其它形状图表得到的数据集对象根据实际情况造型）<br />得到数据点集合后，我们就可以设置各条曲线的颜色，和坐标轴的距离，x轴、y轴的显示方式等等属性<br />xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色<br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离<br />xyplot.setDomainGridlinePaint(Color.white); //网格线纵向颜色<br />xyplot.setRangeGridlinePaint(Color.white); //网格线横向颜色<br />数据点的调整<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />xylineandshaperenderer.setDefaultShapesVisible(true);  //数据点可见<br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //设置第一条曲线数据点填充为红色，如果一个图表有多条曲线可分别设置<br />xylineandshaperenderer.setUseFillPaint(true);    //应用<br /><br />使用xyplot.getRangeAxis()得到纵轴，xyplot.getDomainAxis()得到横轴，得到后可以根据实际情况造型为自己所需要的类型。<br />我的图表纵轴为数值类型，横轴为时间类型，使用如下方式<br />NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();<br />DateAxis  dateaxis =   (DateAxis)xyplot.getDomainAxis();<br />//设置y显示方式<br />numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定<br />double  rangetick = 0.1D;<br />numAxis.setTickUnit(new NumberTickUnit(rangetick));  //y轴单位间隔为0.1<br />//设置x轴显示方式<br />dateaxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定<br />dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x轴单位间隔为1天<br />我们还可以是将数据格式化以后显示，比如y轴显示百分比（10%～100%）,x轴显示为×月×日<br />NumberFormat nf =NumberFormat.getPercentInstance();<br />numAxis.setNumberFormatOverride(nf);//设置y轴以百分比方式显示<br />SimpleDateFormat format = new SimpleDateFormat("MM月dd");<br />dateaxis.setDateFormatOverride(format);//设置x轴数据单位以×月×日方式显示<br />时序图中还有一个很重要的方法<br />timeseriescollection.setDomainIsPointsInTime(true); //x轴上的刻度点代表的是时间点而不是时间段<br />最开始我没有设置这个属性,结果画出来的图，老是差半格不能在这个刻度的时候准确显示，往后移了半格，就是因为JFreeChart默认这个刻度是<br />一个时间段，它把这个刻度和下个刻度的中间点认为是显示数据点最佳位置。<br /><br />其他一些关于AXIS类的方法：<br />Axis类：<br />void setVisible(boolean flag)坐标轴是否可见<br />void setAxisLinePaint(Paint paint)坐标轴线条颜色（3D轴无效）<br />void setAxisLineStroke(Stroke stroke)坐标轴线条笔触（3D轴无效）<br />void setAxisLineVisible(boolean visible)坐标轴线条是否可见（3D轴无效）<br />void setFixedDimension(double dimension)（用于复合表中对多坐标轴的设置）<br />void setLabel(String label)坐标轴标题<br />void setLabelFont(Font font)坐标轴标题字体<br />void setLabelPaint(Paint paint)坐标轴标题颜色<br />void setLabelAngle(double angle)`坐标轴标题旋转角度（纵坐标可以旋转）<br />void setTickLabelFont(Font font)坐标轴标尺值字体<br />void setTickLabelPaint(Paint paint)坐标轴标尺值颜色<br />void setTickLabelsVisible(boolean flag)坐标轴标尺值是否显示<br />void setTickMarkPaint(Paint paint)坐标轴标尺颜色<br />void setTickMarkStroke(Stroke stroke)坐标轴标尺笔触<br />void setTickMarksVisible(boolean flag)坐标轴标尺是否显示<br />ValueAxis(Axis)类：<br />void setAutoRange(boolean auto)自动设置数据轴数据范围<br />void setAutoRangeMinimumSize(double size)自动设置数据轴数据范围时数据范围的最小跨度<br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动确定（默认为true）<br />void setFixedAutoRange(double length)数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />void setInverted(boolean flag)数据轴是否反向（默认为false）<br />void setLowerMargin(double margin)数据轴下（左）边距<br />void setUpperMargin(double margin)数据轴上（右）边距<br />void setLowerBound(double min)数据轴上的显示最小值<br />void setUpperBound(double max)数据轴上的显示最大值<br />void setPositiveArrowVisible(boolean visible)是否显示正向箭头（3D轴无效）<br />void setNegativeArrowVisible(boolean visible)是否显示反向箭头（3D轴无效）<br />void setVerticalTickLabels(boolean flag)数据轴数据标签是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source)数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false）<br />NumberAxis(ValueAxis)类：<br />void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)是否强制在整个数据轴中包含0，即使0不在数据范围中<br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标签的显示格式<br />void setTickUnit(NumberTickUnit unit)数据轴的数据标签（需要将AutoTickUnitSelection设false）<br />DateAxis(ValueAxis)类：<br />void setMaximumDate(Date maximumDate)日期轴上的最小日期<br />void setMinimumDate(Date minimumDate)日期轴上的最大日期<br />void setRange(Date lower,Date upper)日期轴范围<br />void setDateFormatOverride(DateFormat formatter)日期轴日期标签的显示格式<br />void setTickUnit(DateTickUnit unit)日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义）<br />CategoryAxis(Axis)类：<br />void setCategoryMargin(double margin)分类轴边距<br />void setLowerMargin(double margin)分类轴下（左）边距<br />void setUpperMargin(double margin)分类轴上（右）边距<br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)分类轴分类标签的最大宽度<br />jfreechart 设置技巧<br /><br />1.横坐标内容竖立  <br />      XYPlot xyplot = jfreechart.getXYPlot();<br />        DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();<br />        dateaxis.setTickUnit(new DateTickUnit(1, 1, new SimpleDateFormat("MMM-yyyy")));<br />        dateaxis.setVerticalTickLabels(true);<br /><br />2.设置最大坐标范围<br /> 1）ValueAxis axis = xyplot.getRangeAxis() ;<br />       axis.setRange(0,100) ;<br />       xyplot.setRangeAxis(axis); <br /><br />  2）numberaxis1.setUpperBound(6500D);//最大值<br />     numberaxis1.setLowerBound(5500D);//最小值<br />2.设置时间轴的间隔时间<br />    dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//设置时间间隔为一天<br />学JFreeChart不得不看的中文API<br /><br />JFreeChart类：<br />void setAntiAlias(boolean flag)字体模糊边界<br />void setBackgroundImage(Image image)背景图片<br />void setBackgroundImageAlignment(int alignment)背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />void setBackgroundImageAlpha(float alpha)背景图片透明度（0.0～1.0）<br />void setBackgroundPaint(Paint paint)背景色<br />void setBorderPaint(Paint paint)边界线条颜色<br />void setBorderStroke(Stroke stroke)边界线条笔触<br />void setBorderVisible(boolean visible)边界线条是否可见<br /><br />-----------------------------------------------------------------------------------------------------------<br /><br />TextTitle类：<br />void setFont(Font font)标题字体<br />void setPaint(Paint paint)标题字体颜色<br />void setText(String text)标题内容<br /><br />-----------------------------------------------------------------------------------------------------------<br /><br />StandardLegend(Legend)类：<br />void setBackgroundPaint(Paint paint)图示背景色<br />void setTitle(String title)图示标题内容<br />void setTitleFont(Font font)图示标题字体<br />void setBoundingBoxArcWidth(int arcWidth)图示边界圆角宽<br />void setBoundingBoxArcHeight(int arcHeight)图示边界圆角高<br />void setOutlinePaint(Paint paint)图示边界线条颜色<br />void setOutlineStroke(Stroke stroke)图示边界线条笔触<br />void setDisplaySeriesLines(boolean flag)图示项是否显示横线（折线图有效）<br />void setDisplaySeriesShapes(boolean flag)图示项是否显示形状（折线图有效）<br />void setItemFont(Font font)图示项字体<br />void setItemPaint(Paint paint)图示项字体颜色<br />void setAnchor(int anchor)图示在图表中的显示位置（参数常量在Legend类中定义）<br /><br />Axis类：<br />void setVisible(boolean flag)坐标轴是否可见<br />void setAxisLinePaint(Paint paint)坐标轴线条颜色（3D轴无效）<br />void setAxisLineStroke(Stroke stroke)坐标轴线条笔触（3D轴无效）<br />void setAxisLineVisible(boolean visible)坐标轴线条是否可见（3D轴无效）<br />void setFixedDimension(double dimension)（用于复合表中对多坐标轴的设置）<br />void setLabel(String label)坐标轴标题<br />void setLabelFont(Font font)坐标轴标题字体<br />void setLabelPaint(Paint paint)坐标轴标题颜色<br />void setLabelAngle(double angle)`坐标轴标题旋转角度（纵坐标可以旋转）<br />void setTickLabelFont(Font font)坐标轴标尺值字体<br />void setTickLabelPaint(Paint paint)坐标轴标尺值颜色<br />void setTickLabelsVisible(boolean flag)坐标轴标尺值是否显示<br />void setTickMarkPaint(Paint paint)坐标轴标尺颜色<br />void setTickMarkStroke(Stroke stroke)坐标轴标尺笔触<br />void setTickMarksVisible(boolean flag)坐标轴标尺是否显示<br /><br />ValueAxis(Axis)类：<br />void setAutoRange(boolean auto)自动设置数据轴数据范围<br />void setAutoRangeMinimumSize(double size)自动设置数据轴数据范围时数据范围的最小跨度<br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动确定（默认为true）<br />void setFixedAutoRange(double length)数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />void setInverted(boolean flag)数据轴是否反向（默认为false）<br />void setLowerMargin(double margin)数据轴下（左）边距<br />void setUpperMargin(double margin)数据轴上（右）边距<br />void setLowerBound(double min)数据轴上的显示最小值<br />void setUpperBound(double max)数据轴上的显示最大值<br />void setPositiveArrowVisible(boolean visible)是否显示正向箭头（3D轴无效）<br />void setNegativeArrowVisible(boolean visible)是否显示反向箭头（3D轴无效）<br />void setVerticalTickLabels(boolean flag)数据轴数据标签是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source)数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false）<br /><br />NumberAxis(ValueAxis)类：<br />void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)是否强制在整个数据轴中包含0，即使0不在数据范围中<br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标签的显示格式<br />void setTickUnit(NumberTickUnit unit)数据轴的数据标签（需要将AutoTickUnitSelection设false）<br /><br />DateAxis(ValueAxis)类：<br />void setMaximumDate(Date maximumDate)日期轴上的最小日期<br />void setMinimumDate(Date minimumDate)日期轴上的最大日期<br />void setRange(Date lower,Date upper)日期轴范围<br />void setDateFormatOverride(DateFormat formatter)日期轴日期标签的显示格式<br />void setTickUnit(DateTickUnit unit)日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义）<br /><br />CategoryAxis(Axis)类：<br />void setCategoryMargin(double margin)分类轴边距<br />void setLowerMargin(double margin)分类轴下（左）边距<br />void setUpperMargin(double margin)分类轴上（右）边距<br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)分类轴分类标签的最大宽度<br /><br />AbstractRenderer类：<br />void setItemLabelAnchorOffset(double offset)数据标签的与数据点的偏移<br />void setItemLabelsVisible(boolean visible)数据标签是否可见<br />void setItemLabelFont(Font font)数据标签的字体<br />void setItemLabelPaint(Paint paint)数据标签的字体颜色<br />void setItemLabelPosition(ItemLabelPosition position)数据标签位置<br />void setPositiveItemLabelPosition(ItemLabelPosition position)正数标签位置<br />void setNegativeItemLabelPosition(ItemLabelPosition position)负数标签位置<br />void setOutLinePaint(Paint paint)图形边框的线条颜色<br />void setOutLineStroke(Stroke stroke)图形边框的线条笔触<br />void setPaint(Paint paint)所有分类图形的颜色<br />void setShape(Shape shape)所有分类图形的形状（如折线图的点）<br />void setStroke(Stroke stroke)所有分类图形的笔触（如折线图的线）<br />void setSeriesItemLabelsVisible(int series,boolean visible)指定分类的数据标签是否可见<br />void setSeriesItemLabelFont(int series,Font font)指定分类的数据标签的字体<br />void setSeriesItemLabelPaint(int series,Paint paint)指定分类的数据标签的字体颜色<br />void setSeriesItemLabelPosition(int series,ItemLabelPosition position)数据标签位置<br />void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position)正数标签位置<br />void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position)负数标签位置<br />void setSeriesOutLinePaint(int series,Paint paint)指定分类的图形边框的线条颜色<br />void setSeriesOutLineStroke(int series,Stroke stroke)指定分类的图形边框的线条笔触<br />void setSeriesPaint(int series,Paint paint)指定分类图形的颜色<br />void setSeriesShape(int series,Shape shape)指定分类图形的形状（如折线图的点）<br />void setSeriesStroke(int series,Stroke stroke)指定分类图形的笔触（如折线图的线）<br /><br />AbstractCategoryItemRenderer(AbstractRenderer)类：<br />void setLabelGenerator(CategoryLabelGenerator generator)数据标签的格式<br />void setToolTipGenerator(CategoryToolTipGenerator generator)MAP中鼠标移上的显示格式<br />void setItemURLGenerator(CategoryURLGenerator generator)MAP中钻取链接格式<br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator)指定分类的数据标签的格式<br />void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator)指定分类的MAP中鼠标移上的显示格式<br />void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator)指定分类的MAP中钻取链接格式<br /><br />BarRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawBarOutline(boolean draw)是否画图形边框<br />void setItemMargin(double percent)每个BAR之间的间隔<br />void setMaxBarWidth(double percent)每个BAR的最大宽度<br />void setMinimumBarLength(double min)最短的BAR长度，避免数值太小而显示不出<br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)无法在BAR中显示的正数标签位置<br />void setNegativeItemLabelPositionFallback(ItemLabelPosition position)无法在BAR中显示的负数标签位置<br /><br />BarRenderer3D(BarRenderer)类：<br />void setWallPaint(Paint paint)3D坐标轴的墙体颜色<br /><br />StackedBarRenderer(BarRenderer)类：<br />没有特殊的设置<br /><br />StackedBarRenderer3D(BarRenderer3D)类：<br />没有特殊的设置<br /><br />GroupedStackedBarRenderer(StackedBarRenderer)类：<br />void setSeriesToGroupMap(KeyToGroupMap map)将分类自由的映射成若干个组（KeyToGroupMap.mapKeyToGroup(series,group)）<br /><br />LayeredBarRenderer(BarRenderer)类：<br />void setSeriesBarWidth(int series,double width)设定每个分类的宽度（注意设置不要使某分类被覆盖）<br /><br />WaterfallBarRenderer(BarRenderer)类：<br />void setFirstBarPaint(Paint paint)第一个柱图的颜色<br />void setLastBarPaint(Paint paint)最后一个柱图的颜色<br />void setPositiveBarPaint(Paint paint)正值柱图的颜色<br />void setNegativeBarPaint(Paint paint)负值柱图的颜色<br /><br />IntervalBarRenderer(BarRenderer)类：<br />需要传IntervalCategoryDataset作为数据源<br /><br />GanttBarRenderer(IntervalBarRenderer)类：<br />void setCompletePaint(Paint paint)完成进度颜色<br />void setIncompletePaint(Paint paint)未完成进度颜色<br />void setStartPercent(double percent)设置进度条在整条中的起始位置（0.0～1.0）<br />void setEndPercent(double percent)设置进度条在整条中的结束位置（0.0～1.0）<br /><br />StatisticBarRenderer(BarRenderer)类：<br />需要传StatisticCategoryDataset作为数据源<br /><br />LineAndShapeRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawLines(boolean draw)是否折线的数据点之间用线连<br />void setDrawShapes(boolean draw)是否折线的数据点根据分类使用不同的形状<br />void setShapesFilled(boolean filled)所有分类是否填充数据点图形<br />void setSeriesShapesFilled(int series,boolean filled)指定分类是否填充数据点图形<br />void setUseFillPaintForShapeOutline(boolean use)指定是否填充数据点的Paint也被用于画数据点形状的边框<br /><br />LevelRenderer(AbstractCategoryItemRenderer)类：<br />void setItemMargin(double percent)每个分类之间的间隔<br />void setMaxItemWidth(double percent)每个分类的最大宽度<br /><br />CategoryStepRenderer(AbstractCategoryItemRenderer)类：<br />void setStagger(boolean shouldStagger)不同分类的图是否交错<br /><br />MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawLines(boolean drawLines)是否在每个分类线间画连接线<br />void setGroupPaint(Paint groupPaint)一组图形连接线的颜色<br />void setGroupStroke(Stroke groupStroke)一组图形连接线的笔触<br />void setMaxIcon(Icon maxIcon)最大值的ICON<br />void setMinIcon(Icon minIcon)最小值的ICON<br />void setObjectIcon(Icon objectIcon)所有值的ICON<br /><br />AreaRender(AbstractCategoryItemRenderer)类：<br />没有特殊的设置<br /><br />StackedAreaRender(AreaRender)类：<br />没有特殊的设置<br /><br /><br />关键就是用好Renderer这个类了，再贴个例子：<br />    String sFont = "宋体";<br />    chart.setBorderVisible(true);<br />    chart.setBorderPaint(new Color(0xFF,0x66,0x00));<br />    chart.setBackgroundPaint(new Color(0xFF,0xF3,0xDE));<br />    chart.getTitle().setPaint(Color.red);<br />    chart.getTitle().setFont(new Font(sFont,Font.BOLD,14));<br /><br />    //设置Plot，不显示所有网格<br />    ((CategoryPlot)chart.getPlot()).setOutlinePaint(null);<br />    ((CategoryPlot)chart.getPlot()).setDomainGridlinesVisible(false);<br />    ((CategoryPlot)chart.getPlot()).setRangeGridlinesVisible(false);<br /><br />    //设置横轴字体，设定横轴轴线不可见，隐藏纵轴<br />    ((CategoryPlot)chart.getPlot()).getDomainAxis().setTickLabelFont(new Font(sFont,Font.PLAIN,12));<br />    ((CategoryPlot)chart.getPlot()).getDomainAxis().setAxisLineVisible(false);<br />    ((CategoryPlot)chart.getPlot()).getRangeAxis().setVisible(false);<br /><br />    //采用BarRenderer作为表示器<br />    BarRenderer renderer = new BarRenderer();<br />    renderer.setPaint(new GradientPaint(0.0f,0.0f,Color.orange,0.0f,0.0f,Color.yellow));<br />    renderer.setOutlinePaint(Color.orange);<br />    renderer.setDrawBarOutline(true);<br /><br />    //在条中央显示投票数值<br />    renderer.setItemLabelAnchorOffset(-20.0f);<br />    renderer.setLabelGenerator(new StandardCategoryLabelGenerator("{2}",new DecimalFormat()));<br />    renderer.setPositiveItemLabelPosition(new ItemLabelPosition());<br />    renderer.setItemLabelsVisible(true);<img src ="http://www.blogjava.net/terrywu/aggbug/105618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2007-03-22 18:06 <a href="http://www.blogjava.net/terrywu/articles/105618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jfreechart1.0技巧</title><link>http://www.blogjava.net/terrywu/articles/103323.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Mon, 12 Mar 2007 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/103323.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/103323.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/103323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/103323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/103323.html</trackback:ping><description><![CDATA[
		<br />jfreechart目前最高版本为1.0.0版(<a href="http://www.jfree.org/jfreechart/index.html" target="_blank">http://www.jfree.org/jfreechart/index.html</a>)。可以绘制<br />pie charts  饼图,bar charts 柱状图,line and area charts曲线图, scatter plots and bubble charts 散列图,time series 时序图,Area Charts区域图, Difference Chart差异图,Step Chart步骤图,Multiple Axis Charts 混合图,Gantt charts甘特图，combination charts 复合图<br />JFreeChart核心类库介绍：<br />jfreechart主要由两个大的包组成：org.jfree.chart,org.jfree.data。其中前者主要与图形<br />本身有关，后者与图形显示的数据有关。<br />核心类主要有：<br />org.jfree.chart.JFreeChart：图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象<br />org.jfree.data.category.XXXDataSet:数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类<br />org.jfree.chart.plot.XXXPlot：图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持<br />org.jfree.chart.axis.XXXAxis：用于处理图表的两个轴：纵轴和横轴<br />org.jfree.chart.render.XXXRender：负责如何显示一个图表对象<br />org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接<br />XXXXXToolTipGenerator:用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类<br />对于常用的饼图阖柱状图，比较简单而且网上有很多的文章介绍，在这里就不再一一复述了，<br />(可以参考这篇文章<a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc" target="_blank">http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc</a>&amp;me=ccid）<br />主要说明下另一种常见的报表，时序图，首先声明一个曲线数据集合对象和曲线对象<br /><br />TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();<br />//声明具体是曲线对象，(可根据实际情况在同一张图中显示多条曲线进行数据比对，根据实际应用情况当超过4条曲线时，就会有些乱。)<br />TimePeriodValues timeperiod1 = new TimePeriodValues("服务器A在线用户数量");<br />TimePeriodValues timeperiod2 = new TimePeriodValues("服务器B在线用户数量");<br />我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();<br />TimeSeries ts = new TimeSeries();<br />在生成数据集时（ts.add(new Day(day, month, year),10))）只能生成最小单位为天的横轴所以改用了TimePeriodValuesCollection <br />//根据当前时间取得横轴坐标，时间间隔为1小时<br />Calendar cal = Calendar.getInstance();<br />int year = cal.get(Calendar.YEAR);<br />int month = cal.get(Calendar.MONTH) + 1;<br />int day = cal.get(Calendar.DAY_OF_MONTH);<br />//这里改为根据自己程序得到的需要显示的时间点和对应的数据的集合;<br />List objectList1 = dao.getList1();<br />List objectList2 = dao.getList2();<br />//使用循环，把x轴，y轴的值赋给timeseries1<br />for (int i =0;i&lt;objecthash1.size();i++) {<br />    int hour = objecthash1[i].getHours();<br />    int count = objecthash1[i].getCount();<br /> //将每一对数据（时间，数值）添加到数据集合1(曲线对象1)中<br />    timeseries1.add(new Hour(hour, day, month, year),count);<br />}<br />for (int i =0;i&lt;objecthash2.size();i++) {<br />    int hour = objecthash2[i].getHours();<br />    int count = objecthash2[i].getCount();<br /> //将每一对数据（时间，数值）添加到数据集合2(曲线对象2)中<br />    timeseries2.add(new Hour(hour, day, month, year),count);<br />}<br />//将曲线对象添加到曲线数据集合对象中<br />timeseriescollection.addSeries(timeseries1);<br />timeseriescollection.addSeries(timeseries2);<br />//绘制报表<br />String title = "日在线用户统计"; //报表标题<br />String domain = "时间";    //x轴<br />String range = "用户在线数量";   //y轴<br />//创建时间序列图对象<br />JFreeChart chart = ChartFactory.createTimeSeriesChart(<br />title,  //报表标题<br />domain, //报表横轴标签<br />range,  //报表纵轴标签<br />timeseriescollection, //数据集合<br />true,  //是否显示图例,在这里如果为true则会在图表的下方显示各条数据曲线的名称和颜色<br />false, // 是否生成工具<br />false   // 是否生成URL链接);<br />//将报表保存为jpg文件<br />ChartUtilities.saveChartAsJPEG(file, //文件保存物理路径包括路径和文件名<br />100,   //图片质量<br />chart, //图表对象<br />1024,  //图像宽度<br />768,   //图像高度<br />null); //显示信息<br />//将报表直接在页面输出<br />ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);<br /><br />String title="月在线用户统计";  //标题<br />String domain="时间(天)";//x轴<br />String range="用户在线数量";//y轴 <br />TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();<br />TimePeriodValues timeseries = new TimePeriodValues( "用户数量");<br /> timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);<br /> timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);<br /> timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);<br /> timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);<br />JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);<br />当我们生成了一个报表对象时，可能需要根据实际情况来决定报表的横轴和纵轴的数值间隔，显示方式等。<br />可以用XYPlot xyplot = (XYPlot)chart.getPlot();来得到所有数据点的集合。（其它形状图表得到的数据集对象根据实际情况造型）<br />得到数据点集合后，我们就可以设置各条曲线的颜色，和坐标轴的距离，x轴、y轴的显示方式等等属性<br />xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色<br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离<br />xyplot.setDomainGridlinePaint(Color.white); //网格线纵向颜色<br />xyplot.setRangeGridlinePaint(Color.white); //网格线横向颜色<br />数据点的调整<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />xylineandshaperenderer.setDefaultShapesVisible(true);  //数据点可见<br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //设置第一条曲线数据点填充为红色，如果一个图表有多条曲线可分别设置<br />xylineandshaperenderer.setUseFillPaint(true);    //应用<br /><br />使用xyplot.getRangeAxis()得到纵轴，xyplot.getDomainAxis()得到横轴，得到后可以根据实际情况造型为自己所需要的类型。<br />我的图表纵轴为数值类型，横轴为时间类型，使用如下方式<br />NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();<br />DateAxis  dateaxis =   (DateAxis)xyplot.getDomainAxis();<br />//设置y显示方式<br />numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定<br />double  rangetick = 0.1D;<br />numAxis.setTickUnit(new NumberTickUnit(rangetick));  //y轴单位间隔为0.1<br />//设置x轴显示方式<br />dateaxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定<br />dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x轴单位间隔为1天<br />我们还可以是将数据格式化以后显示，比如y轴显示百分比（10%～100%）,x轴显示为×月×日<br />NumberFormat nf =NumberFormat.getPercentInstance();<br />numAxis.setNumberFormatOverride(nf);//设置y轴以百分比方式显示<br />SimpleDateFormat format = new SimpleDateFormat("MM月dd");<br />dateaxis.setDateFormatOverride(format);//设置x轴数据单位以×月×日方式显示<br />时序图中还有一个很重要的方法<br />timeseriescollection.setDomainIsPointsInTime(true); //x轴上的刻度点代表的是时间点而不是时间段<br />最开始我没有设置这个属性,结果画出来的图，老是差半格不能在这个刻度的时候准确显示，往后移了半格，就是因为JFreeChart默认这个刻度是<br />一个时间段，它把这个刻度和下个刻度的中间点认为是显示数据点最佳位置。<br /><br />其他一些关于AXIS类的方法：<br />Axis类：<br />void setVisible(boolean flag)坐标轴是否可见<br />void setAxisLinePaint(Paint paint)坐标轴线条颜色（3D轴无效）<br />void setAxisLineStroke(Stroke stroke)坐标轴线条笔触（3D轴无效）<br />void setAxisLineVisible(boolean visible)坐标轴线条是否可见（3D轴无效）<br />void setFixedDimension(double dimension)（用于复合表中对多坐标轴的设置）<br />void setLabel(String label)坐标轴标题<br />void setLabelFont(Font font)坐标轴标题字体<br />void setLabelPaint(Paint paint)坐标轴标题颜色<br />void setLabelAngle(double angle)`坐标轴标题旋转角度（纵坐标可以旋转）<br />void setTickLabelFont(Font font)坐标轴标尺值字体<br />void setTickLabelPaint(Paint paint)坐标轴标尺值颜色<br />void setTickLabelsVisible(boolean flag)坐标轴标尺值是否显示<br />void setTickMarkPaint(Paint paint)坐标轴标尺颜色<br />void setTickMarkStroke(Stroke stroke)坐标轴标尺笔触<br />void setTickMarksVisible(boolean flag)坐标轴标尺是否显示<br />ValueAxis(Axis)类：<br />void setAutoRange(boolean auto)自动设置数据轴数据范围<br />void setAutoRangeMinimumSize(double size)自动设置数据轴数据范围时数据范围的最小跨度<br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动确定（默认为true）<br />void setFixedAutoRange(double length)数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />void setInverted(boolean flag)数据轴是否反向（默认为false）<br />void setLowerMargin(double margin)数据轴下（左）边距<br />void setUpperMargin(double margin)数据轴上（右）边距<br />void setLowerBound(double min)数据轴上的显示最小值<br />void setUpperBound(double max)数据轴上的显示最大值<br />void setPositiveArrowVisible(boolean visible)是否显示正向箭头（3D轴无效）<br />void setNegativeArrowVisible(boolean visible)是否显示反向箭头（3D轴无效）<br />void setVerticalTickLabels(boolean flag)数据轴数据标签是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source)数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false）<br />NumberAxis(ValueAxis)类：<br />void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)是否强制在整个数据轴中包含0，即使0不在数据范围中<br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标签的显示格式<br />void setTickUnit(NumberTickUnit unit)数据轴的数据标签（需要将AutoTickUnitSelection设false）<br />DateAxis(ValueAxis)类：<br />void setMaximumDate(Date maximumDate)日期轴上的最小日期<br />void setMinimumDate(Date minimumDate)日期轴上的最大日期<br />void setRange(Date lower,Date upper)日期轴范围<br />void setDateFormatOverride(DateFormat formatter)日期轴日期标签的显示格式<br />void setTickUnit(DateTickUnit unit)日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义）<br />CategoryAxis(Axis)类：<br />void setCategoryMargin(double margin)分类轴边距<br />void setLowerMargin(double margin)分类轴下（左）边距<br />void setUpperMargin(double margin)分类轴上（右）边距<br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)分类轴分类标签的最大宽度<img src ="http://www.blogjava.net/terrywu/aggbug/103323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2007-03-12 14:47 <a href="http://www.blogjava.net/terrywu/articles/103323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChart API</title><link>http://www.blogjava.net/terrywu/articles/49471.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Thu, 01 Jun 2006 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/49471.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/49471.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/49471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/49471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/49471.html</trackback:ping><description><![CDATA[
		<div>JFreeChart类：<br />void setAntiAlias(boolean flag)    字体模糊边界<br />void setBackgroundImage(Image image)   背景图片<br />void setBackgroundImageAlignment(int alignment)  背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />void setBackgroundImageAlpha(float alpha)  背景图片透明度（0.0～1.0）<br />void setBackgroundPaint(Paint paint)   背景色<br />void setBorderPaint(Paint paint)   边界线条颜色<br />void setBorderStroke(Stroke stroke)   边界线条笔触<br />void setBorderVisible(boolean visible)   边界线条是否可见</div>
		<br />
		<div>
				<br />
				<p>----------------------------------------------------------------------------------------------------------- <br /></p>
				<p>TextTitle类：<br />void setFont(Font font)     标题字体<br />void setPaint(Paint paint)    标题字体颜色<br />void setText(String text)    标题内容 <br /></p>
				<p>----------------------------------------------------------------------------------------------------------- <br /></p>
				<p>StandardLegend(Legend)类：<br />void setBackgroundPaint(Paint paint)   图示背景色<br />void setTitle(String title)    图示标题内容<br />void setTitleFont(Font font)    图示标题字体<br />void setBoundingBoxArcWidth(int arcWidth)  图示边界圆角宽<br />void setBoundingBoxArcHeight(int arcHeight)  图示边界圆角高<br />void setOutlinePaint(Paint paint)   图示边界线条颜色<br />void setOutlineStroke(Stroke stroke)   图示边界线条笔触<br />void setDisplaySeriesLines(boolean flag)  图示项是否显示横线（折线图有效）<br />void setDisplaySeriesShapes(boolean flag)  图示项是否显示形状（折线图有效）<br />void setItemFont(Font font)    图示项字体<br />void setItemPaint(Paint paint)    图示项字体颜色<br />void setAnchor(int anchor)    图示在图表中的显示位置（参数常量在Legend类中定义） <br /></p>
				<p>----------------------------------------------------------------------------------------------------------- <br /></p>
				<p>Axis类：<br />void setVisible(boolean flag)    坐标轴是否可见<br />void setAxisLinePaint(Paint paint)   坐标轴线条颜色（3D轴无效）<br />void setAxisLineStroke(Stroke stroke)   坐标轴线条笔触（3D轴无效）<br />void setAxisLineVisible(boolean visible)  坐标轴线条是否可见（3D轴无效）<br />void setFixedDimension(double dimension)  （用于复合表中对多坐标轴的设置）<br />void setLabel(String label)    坐标轴标题<br />void setLabelFont(Font font)    坐标轴标题字体<br />void setLabelPaint(Paint paint)    坐标轴标题颜色<br />void setLabelAngle(double angle)`   坐标轴标题旋转角度（纵坐标可以旋转）<br />void setTickLabelFont(Font font)   坐标轴标尺值字体<br />void setTickLabelPaint(Paint paint)   坐标轴标尺值颜色<br />void setTickLabelsVisible(boolean flag)   坐标轴标尺值是否显示<br />void setTickMarkPaint(Paint paint)   坐标轴标尺颜色<br />void setTickMarkStroke(Stroke stroke)   坐标轴标尺笔触<br />void setTickMarksVisible(boolean flag)   坐标轴标尺是否显示 <br /></p>
				<p>ValueAxis(Axis)类：<br />void setAutoRange(boolean auto)    自动设置数据轴数据范围<br />void setAutoRangeMinimumSize(double size)  自动设置数据轴数据范围时数据范围的最小跨度<br />void setAutoTickUnitSelection(boolean flag)  数据轴的数据标签是否自动确定（默认为true）<br />void setFixedAutoRange(double length)   数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />void setInverted(boolean flag)    数据轴是否反向（默认为false）<br />void setLowerMargin(double margin)   数据轴下（左）边距<br />void setUpperMargin(double margin)   数据轴上（右）边距<br />void setLowerBound(double min)    数据轴上的显示最小值<br />void setUpperBound(double max)    数据轴上的显示最大值<br />void setPositiveArrowVisible(boolean visible)  是否显示正向箭头（3D轴无效）<br />void setNegativeArrowVisible(boolean visible)  是否显示反向箭头（3D轴无效）<br />void setVerticalTickLabels(boolean flag)  数据轴数据标签是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false） <br /></p>
				<p>NumberAxis(ValueAxis)类：<br />void setAutoRangeIncludesZero(boolean flag)  是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)  是否强制在整个数据轴中包含0，即使0不在数据范围中<br />void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式<br />void setTickUnit(NumberTickUnit unit)   数据轴的数据标签（需要将AutoTickUnitSelection设false） <br /></p>
				<p>DateAxis(ValueAxis)类：<br />void setMaximumDate(Date maximumDate)   日期轴上的最小日期<br />void setMinimumDate(Date minimumDate)   日期轴上的最大日期<br />void setRange(Date lower,Date upper)   日期轴范围<br />void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式<br />void setTickUnit(DateTickUnit unit)   日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义） <br /></p>
				<p>CategoryAxis(Axis)类：<br />void setCategoryMargin(double margin)   分类轴边距<br />void setLowerMargin(double margin)   分类轴下（左）边距<br />void setUpperMargin(double margin)   分类轴上（右）边距<br />void setVerticalCategoryLabels(boolean flag)  分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)  分类轴分类标签的最大宽度 <br /></p>
				<p>----------------------------------------------------------------------------------------------------------- <br /></p>
				<p>Plot类：<br />void setBackgroundImage(Image image)   数据区的背景图片<br />void setBackgroundImageAlignment(int alignment)  数据区的背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />void setBackgroundPaint(Paint paint)   数据区的背景图片背景色<br />void setBackgroundAlpha(float alpha)   数据区的背景透明度（0.0～1.0）<br />void setForegroundAlpha(float alpha)   数据区的前景透明度（0.0～1.0）<br />void setDataAreaRatio(double ratio)   数据区占整个图表区的百分比<br />void setOutLinePaint(Paint paint)   数据区的边界线条颜色<br />void setOutLineStroke(Stroke stroke)   数据区的边界线条笔触<br />void setNoDataMessage(String message)   没有数据时显示的消息<br />void setNoDataMessageFont(Font font)   没有数据时显示的消息字体<br />void setNoDataMessagePaint(Paint paint)   没有数据时显示的消息颜色 <br /></p>
				<p>CategoryPlot(Plot)类：<br />void setDataset(CategoryDataset dataset)  数据区的2维数据表<br />void setColumnRenderingOrder(SortOrder order)  数据分类的排序方式<br />void setAxisOffset(Spacer offset)   坐标轴到数据区的间距<br />void setOrientation(PlotOrientation orientation) 数据区的方向（PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL）<br />void setDomainAxis(CategoryAxis axis)   数据区的分类轴<br />void setDomainAxisLocation(AxisLocation location) 分类轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />void setDomainGridlinesVisible(boolean visible)  分类轴网格是否可见<br />void setDomainGridlinePaint(Paint paint)  分类轴网格线条颜色<br />void setDomainGridlineStroke(Stroke stroke)  分类轴网格线条笔触<br />void setRangeAxis(ValueAxis axis)   数据区的数据轴<br />void setRangeAxisLocation(AxisLocation location) 数据轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />void setRangeGridlinesVisible(boolean visible)  数据轴网格是否可见<br />void setRangeGridlinePaint(Paint paint)   数据轴网格线条颜色<br />void setRangeGridlineStroke(Stroke stroke)  数据轴网格线条笔触<br />void setRenderer(CategoryItemRenderer renderer)  数据区的表示者（详见Renderer组）<br />void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释<br />void addRangeMarker(Marker marker,Layer layer)  给数据区加一个数值范围区域 <br /></p>
				<p>PiePlot(Plot)类：<br />void setDataset(PieDataset dataset)   数据区的1维数据表<br />void setIgnoreNullValues(boolean flag)   忽略无值的分类<br />void setCircular(boolean flag)    饼图是否一定是正圆<br />void setStartAngle(double angle)   饼图的初始角度<br />void setDirection(Rotation direction)   饼图的旋转方向<br />void setExplodePercent(int section,double percent) 抽取的那块（1维数据表的分类下标）以及抽取出来的距离（0.0～1.0），3D饼图无效<br />void setLabelBackgroundPaint(Paint paint)  分类标签的底色<br />void setLabelFont(Font font)    分类标签的字体<br />void setLabelPaint(Paint paint)    分类标签的字体颜色<br />void setLabelLinkMargin(double margin)   分类标签与图的连接线边距<br />void setLabelLinkPaint(Paint paint)   分类标签与图的连接线颜色<br />void setLabelLinkStroke(Stroke stroke)   分类标签与图的连接线笔触<br />void setLabelOutlinePaint(Paint paint)   分类标签边框颜色<br />void setLabelOutlineStroke(Paint paint)   分类标签边框笔触<br />void setLabelShadowPaint(Paint paint)   分类标签阴影颜色<br />void setMaximumLabelWidth(double width)   分类标签的最大长度（0.0～1.0）<br />void setPieIndex(int index)    饼图的索引（复合饼图中用到）<br />void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色<br />void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触<br />void setSectionPaint(int section,Paint paint)  指定分类饼的颜色<br />void setShadowPaint(Paint paint)   饼图的阴影颜色<br />void setShadowXOffset(double offset)   饼图的阴影相对图的水平偏移<br />void setShadowYOffset(double offset)   饼图的阴影相对图的垂直偏移<br />void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式，设置成null则整个标签包括连接线都不显示<br />void setToolTipGenerator(PieToolTipGenerator generator)  MAP中鼠标移上的显示格式<br />void setURLGenerator(PieURLGenerator generator)   MAP中钻取链接格式 <br /></p>
				<p>PiePlot3D(PiePlot)类：<br />void setDepthFactor(double factor)   3D饼图的Z轴高度（0.0～1.0） <br /></p>
				<p>MultiplePiePlot(Plot)类：<br />void setLimit(double limit)    每个饼图之间的数据关联（详细比较复杂）   <br />void setPieChart(JFreeChart pieChart)   每个饼图的显示方式（见JFreeChart类个PiePlot类） <br /></p>
				<p>----------------------------------------------------------------------------------------------------------- <br /></p>
				<p>AbstractRenderer类：<br />void setItemLabelAnchorOffset(double offset)     数据标签的与数据点的偏移<br />void setItemLabelsVisible(boolean visible)     数据标签是否可见<br />void setItemLabelFont(Font font)      数据标签的字体<br />void setItemLabelPaint(Paint paint)      数据标签的字体颜色<br />void setItemLabelPosition(ItemLabelPosition position)    数据标签位置<br />void setPositiveItemLabelPosition(ItemLabelPosition position)   正数标签位置<br />void setNegativeItemLabelPosition(ItemLabelPosition position)   负数标签位置<br />void setOutLinePaint(Paint paint)      图形边框的线条颜色<br />void setOutLineStroke(Stroke stroke)      图形边框的线条笔触<br />void setPaint(Paint paint)       所有分类图形的颜色<br />void setShape(Shape shape)       所有分类图形的形状（如折线图的点）<br />void setStroke(Stroke stroke)       所有分类图形的笔触（如折线图的线）<br />void setSeriesItemLabelsVisible(int series,boolean visible)   指定分类的数据标签是否可见<br />void setSeriesItemLabelFont(int series,Font font)    指定分类的数据标签的字体<br />void setSeriesItemLabelPaint(int series,Paint paint)    指定分类的数据标签的字体颜色<br />void setSeriesItemLabelPosition(int series,ItemLabelPosition position)  数据标签位置<br />void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置<br />void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置<br />void setSeriesOutLinePaint(int series,Paint paint)    指定分类的图形边框的线条颜色<br />void setSeriesOutLineStroke(int series,Stroke stroke)    指定分类的图形边框的线条笔触<br />void setSeriesPaint(int series,Paint paint)     指定分类图形的颜色<br />void setSeriesShape(int series,Shape shape)     指定分类图形的形状（如折线图的点）<br />void setSeriesStroke(int series,Stroke stroke)     指定分类图形的笔触（如折线图的线） <br /></p>
				<p>AbstractCategoryItemRenderer(AbstractRenderer)类：<br />void setLabelGenerator(CategoryLabelGenerator generator)   数据标签的格式<br />void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠标移上的显示格式<br />void setItemURLGenerator(CategoryURLGenerator generator)   MAP中钻取链接格式<br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式<br />void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式<br />void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式 <br /></p>
				<p>BarRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawBarOutline(boolean draw)      是否画图形边框<br />void setItemMargin(double percent)      每个BAR之间的间隔<br />void setMaxBarWidth(double percent)      每个BAR的最大宽度<br />void setMinimumBarLength(double min)      最短的BAR长度，避免数值太小而显示不出<br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显示的正数标签位置<br />void setNegativeItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显示的负数标签位置 <br /></p>
				<p>BarRenderer3D(BarRenderer)类：<br />void setWallPaint(Paint paint)    3D坐标轴的墙体颜色 <br /></p>
				<p>StackedBarRenderer(BarRenderer)类：<br />没有特殊的设置 <br /></p>
				<p>StackedBarRenderer3D(BarRenderer3D)类：<br />没有特殊的设置 <br /></p>
				<p>GroupedStackedBarRenderer(StackedBarRenderer)类：<br />void setSeriesToGroupMap(KeyToGroupMap map)  将分类自由的映射成若干个组（KeyToGroupMap.mapKeyToGroup(series,group)） <br /></p>
				<p>LayeredBarRenderer(BarRenderer)类：<br />void setSeriesBarWidth(int series,double width)  设定每个分类的宽度（注意设置不要使某分类被覆盖） <br /></p>
				<p>WaterfallBarRenderer(BarRenderer)类：<br />void setFirstBarPaint(Paint paint)   第一个柱图的颜色<br />void setLastBarPaint(Paint paint)   最后一个柱图的颜色<br />void setPositiveBarPaint(Paint paint)   正值柱图的颜色<br />void setNegativeBarPaint(Paint paint)   负值柱图的颜色 <br /></p>
				<p>IntervalBarRenderer(BarRenderer)类：<br />需要传IntervalCategoryDataset作为数据源 <br /></p>
				<p>GanttBarRenderer(IntervalBarRenderer)类：<br />void setCompletePaint(Paint paint)   完成进度颜色<br />void setIncompletePaint(Paint paint)   未完成进度颜色<br />void setStartPercent(double percent)   设置进度条在整条中的起始位置（0.0～1.0）<br />void setEndPercent(double percent)   设置进度条在整条中的结束位置（0.0～1.0） <br /></p>
				<p>StatisticBarRenderer(BarRenderer)类：<br />需要传StatisticCategoryDataset作为数据源 <br /></p>
				<p>LineAndShapeRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawLines(boolean draw)    是否折线的数据点之间用线连<br />void setDrawShapes(boolean draw)   是否折线的数据点根据分类使用不同的形状<br />void setShapesFilled(boolean filled)   所有分类是否填充数据点图形<br />void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形<br />void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框 <br /></p>
				<p>LevelRenderer(AbstractCategoryItemRenderer)类：<br />void setItemMargin(double percent)   每个分类之间的间隔<br />void setMaxItemWidth(double percent)   每个分类的最大宽度 <br /></p>
				<p>CategoryStepRenderer(AbstractCategoryItemRenderer)类：<br />void setStagger(boolean shouldStagger)   不同分类的图是否交错 <br /></p>
				<p>MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类：<br />void setDrawLines(boolean drawLines)   是否在每个分类线间画连接线<br />void setGroupPaint(Paint groupPaint)   一组图形连接线的颜色<br />void setGroupStroke(Stroke groupStroke)   一组图形连接线的笔触<br />void setMaxIcon(Icon maxIcon)    最大值的ICON<br />void setMinIcon(Icon minIcon)    最小值的ICON<br />void setObjectIcon(Icon objectIcon)   所有值的ICON <br /></p>
				<p>AreaRender(AbstractCategoryItemRenderer)类：<br />没有特殊的设置 <br /></p>
				<p>StackedAreaRender(AreaRender)类：<br />没有特殊的设置</p>
		</div>
<img src ="http://www.blogjava.net/terrywu/aggbug/49471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2006-06-01 10:48 <a href="http://www.blogjava.net/terrywu/articles/49471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JasperReport经验谈 </title><link>http://www.blogjava.net/terrywu/articles/49461.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Thu, 01 Jun 2006 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/49461.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/49461.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/49461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/49461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/49461.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial">JasperReport和iReport是不错的Java报表工具. 在实际项目中, 本人用它们开发了20个Report, 涉及SubReport, Image, Graph, 积累了一些经验. 尤其是关于Export到Excel方面, 文档上也很少提及, 纯粹是摸索出来的, 有的问题还是通过读源代码才解决的. 此贴并非入门教程, 差不多算是笔记吧, 以问答形式记录. </font>
				<br />
		</p>
		<p style="TEXT-INDENT: 2em"> </p>
		<ol>
				<p style="TEXT-INDENT: 2em"> </p>
				<li>iReport 
<p style="TEXT-INDENT: 2em"> </p></li>
				<li>安装 
<p style="TEXT-INDENT: 2em"> </p><ol><p style="TEXT-INDENT: 2em"> </p><li>下载，解压iReport 0.4.0 (推荐src版本） 
<p style="TEXT-INDENT: 2em"> </p></li><li>确认JDK是1.4以上 
<p style="TEXT-INDENT: 2em"> </p></li><li>把JDK /lib下的tools.jar拷贝到{ireport_home}/lib目录中 </li></ol><p style="TEXT-INDENT: 2em"> </p></li>
				<li>运行 
<p style="TEXT-INDENT: 2em"> </p><ol><p style="TEXT-INDENT: 2em"> </p><li>对于下载的Binary版本，只能运行/bin/startup.bat 
<p style="TEXT-INDENT: 2em"> </p></li><li>对于下载的Src版本，可以通过ant iReport运行（先安装ant) 
<p style="TEXT-INDENT: 2em"> </p></li><li>如果运行startup.bat，出现java.lang.NoSuchMethodError错误，一般是JDK版本太低。如果确认已安装了1.4或以上，检查path系统变量，看看有1.3的JRE是不是排在前面（比如安装了Oracle的客户端，往往有1.3的JRE），如果出现Class Not Found，检查classpath。对于通过ant的方式运行，一般都没什么问题，所以推荐下载src版本 </li></ol><p style="TEXT-INDENT: 2em"> </p></li>
				<li>JasperReport 常见问题 
<p style="TEXT-INDENT: 2em"> </p><ol><p style="TEXT-INDENT: 2em"> </p><li>.jrxml vs .jasper 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>如果在运行时载入.jrxml, 那么每次调用还得编译, 不如预先编译成.jasper.不过预先编译的jasper,必须用同样版本的JasperReport载入,而且灵活性差些. 不过对于大部分报表,还是预先编译成jasper方便 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如果批量编译jrxml 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>用Ant很容易解决<br /><code><taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask"></taskdef><br /> <classpath refid="classpath"></classpath><br /><br />..... <br /><jrc excludes="*.bak.jrxml" includes="*.jrxml" destdir="${buildDir}/jasperReports" srcdir="${jasperReportDir}"></jrc><br /> <classpath refid="classpath"></classpath><br /><br /></code></li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如何使用图片？ 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>很容易,用Image控件就可以了. 在Image Express里面可以用String来表示图片的路径, 或者用InputStream, File对象.不过不管用File还是String对象, 都不得不用绝对路径, 这显然很不灵活. 解决办法是,穿入一个$P的参数,表示图片所在的目录,然后用$P和文件名拼接出完整的绝对路径. 更好的方法是用InputStream, 例如this.getClass().getResourceAsStream("logo.jpg") ,这时只要把图片放在当前.jasper所在的目录就可以了,不必考虑什么参数,什么路径了 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>显示非数据库字段变量 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>显示如运行日期等,可以直接在Text Field里面输入new java.util.Date(), 然后把Pattern设成如mm/dd/yyyy. </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>动态控制某些Field是否显示 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>每个Static Text, Text Field甚至整个Band的属性里面都有Print When Expression, 比如设成new Boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么只有当参数display的值为yes的时候才显示 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>使用Sub Report, 如何使用相对路径 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>见1.3, 和使用图片类似, 用InputStream或者传入参数 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>Query里面如何使用参数 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>$P!{xxx} 或者 $P{xxx} 后者只能用于类似PreparedStatement参数绑定, 而前者可替换Sql的任意部分. 在需要动态排序的时候, 前者特别有用. 比如 select a,b,c from t order by $P!{orderClause}   不管用$P还是$P!, SQL最终是以PreparedStatement方式执行的, 不必太担心性能问题   注意:参数是不能嵌套的, 比如$P{a} =''$P{b}''   , $P{b}=''value'', 不要指望$P{a}能被替换成''value'' </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如何使用图表(Graph) 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>JasperReport本身没有图表功能, 只有显示Image的功能(见4.3). iReport里有个Graph向导, 其实质是通过jFreeChart生成Image. 更另外, 更直接的做法是放一个Image控件, Image Express Class设置成java.awt.Image, 在Image Expression里通过自定义的类返回java.awt.Image对象. 例如''GraphProvider.getImage($P{REPORT_DATASOURCE},title, subtitle.....)''.  GraphProvider是自己的类, public static Image getImage(JRDataSource, ....) </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如果显示多个图表 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>在一张报表上显示一个图表和显示多个图表是不同的. 假设Query是select name,price,qty from xxx, 第一张图显示name-price, 第二张图显示name-qty, 如果还是按3.8的方法, 第二张图根本显示不出来! 为什么  因为传入的是JRDataSource, 而JRDataSource仅仅是对ResultSet的简单封装, 在第一张图处理完后, 游标已经到了eof位置了, 在开始处理第二张图的时候,就必然抛出游标耗尽的异常! 怎么办   自己写个JRDataSourceAdapter, 把JRDataSource对象里面的值预先保存到一个Collection (相当于一个Offline的数据集), 然后把这个Collection传个getImage方法. 具体是, 建一个Variable  mydate, 类型是java.util.Map, Calculation Type- System, Initial Value Expression是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE},new String[]{"NAME","PRICE","QTY"},new Class[]{java.lang.String.class,java.lang.Double.class,java.lang.Double.class}), JRDataSource2Map是自己写的一个Adapter. 然后在Image的Expression里面换成如''GraphProvider.getImage(mydata,title, other params...), 当然得修改getImage方法 </li></ul></li></ol><p style="TEXT-INDENT: 2em"> </p></li>
				<li>Export到Excel的问题 
<p style="TEXT-INDENT: 2em"> </p><ol><p style="TEXT-INDENT: 2em"> </p><li>如何去掉报表头等 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>直接把不需要的Band删除(把其高度设为0). 如果仅仅是export到Excel的时候不需要报表头, 而输出到PDF等仍然需要保留, 那么使用print when expression, 见4.4 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如果让Excel看起来整齐 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>不要有空白地方! 首先把所有的Field设成一样高, 对齐! 把所在Band的高度也设成和Field一样高, 让Field正好放入Band. 然后调整Field的宽度, 让每个Field都相邻,没有空隙. 最后,记得设置参数: exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,<br />                    Boolean.TRUE);<br /></li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如何保留GridLine 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>首先, 设置参数exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 然后,把每个Field或者Static Text框的''Transparent''属性都勾上 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如何使字段名只显示一次 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>如果把字段名放在ColumnHead区域, 那么输出到Excel, 会每个Page都显示一遍. 在设计Report时候, 一般会设定Page大小. 然而对于Excel, 这个Page设定仍然存在,而且往往很讨厌, 因为在Excel里, 通常希望得到连续的数据, 然而Jasper仍然会''自作多情''进行分页. 比如说, 设计JasperReport的时候, 设定page size为Letter, Portrait, 那么输出到Excel的时候每隔大约30行(具体取决于Field的高度), page header, column header, column foot, page foot 会被重复一次, 而且还附带一个高度为0的Excel Row, 表示Page Break的地方. 把字段名放在title band里, 可以解决字段名重复的问题, 当然page header也不要显示了. 如果需要, 可以把title band的print when expression设成只有输出Excel的时候才显示 </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>为什么Excel里面的数据是从第二行,第B列开始显示的  
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>因为第一行和第A列分别是用来表示page top margin 和 page left margin的. 对于Excel来说, 纯粹多余. 解决方法是把page margin 设成0. 不过如果这个report还需要以PDF等显示, 那么设成0就不好看了. 最好能动态的改变page margin. 当然,这个改变只能在外部(调用Report的地方) 进行, 在设计Report的时候是无能为力的. 不幸的是, JasperReport类居然没有setMargin的方法,只有getter. 折中的方法只能是reflect了. 代码示意如下: //use reflect to set the private field of JRBaseReport<br />                 java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(<br />                        "leftMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0);                 margin = JRBaseReport.class.getDeclaredField("topMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0);                 margin = JRBaseReport.class.getDeclaredField("bottomMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0); </li></ul><p style="TEXT-INDENT: 2em"> </p></li><li>如何去掉Excel中隐藏的行  
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>如前说述, 由于page break的关系, Excel中每隔几十行,就有一个高度为0的row, 即使把page botom margin设为0, 把page footer去掉都没有办法. 唯一的解决办法是把page height设为很大. 同5.5一样, 不得不使用reflect: 
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField(<br />                        "pageHeight");<br />                pageHeight.setAccessible(true);<br />                pageHeight.setInt(myRpt, Integer.MAX_VALUE);<br /></li></ul></li></ul></li></ol><p style="TEXT-INDENT: 2em"> </p></li>
				<li>文档 
<p style="TEXT-INDENT: 2em"> </p><ol><p style="TEXT-INDENT: 2em"> </p><li>哪里有文档  
<p style="TEXT-INDENT: 2em"> </p><ul><p style="TEXT-INDENT: 2em"> </p><li>JasperReport有份Ultimate Guide, 不过不是免费的, 和jFreeChart一个德行. 不过网上有流传, 写的还可以, 60多页, 不过也没详细到哪里去. 如果下载源代码版, 那么看看自带的Demo也不错. SF的论坛也是问问题的最好地方 </li></ul></li></ol><p style="TEXT-INDENT: 2em"> </p></li>
				<li>源代码 仅供参考(reportProvider--一个Servlet, GraphProider, JRDataAdapter都是普通类) </li>
		</ol>
		<p style="TEXT-INDENT: 2em"> </p>
		<p>/**<br /> * </p>
		<p style="TEXT-INDENT: 2em"> </p>
		<p>Title: ReportProviderServlet</p>
		<br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Description: Servlet to generate Jasper reports</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Copyright: Copyright (c) 2004</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Company: *****</p><br /> * @author zephyr<br /> * @version 1.0<br /> */<br />package xyz; 
<p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p>import net.sf.jasperreports.engine.*;<br />import net.sf.jasperreports.engine.base.*;<br />import net.sf.jasperreports.engine.export.*;<br />import net.sf.jasperreports.engine.util.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import org.apache.log4j.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.io.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.sql.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.util.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import javax.servlet.*;<br />import javax.servlet.http.*;</p><p style="TEXT-INDENT: 2em"> </p><p><br />public class ReportProviderServlet extends HttpServlet<br />{<br />    private static Logger log = LogManager.getLogger(ReportProviderServlet.class);</p><p style="TEXT-INDENT: 2em"> </p><p>    //Initialize: Setup DataSourceManager<br />    public void init() throws javax.servlet.ServletException<br />    {<br />        String prefix = getServletContext().getRealPath("/");<br />        String file = getInitParameter("data-source-file");</p><p style="TEXT-INDENT: 2em"> </p><p>        DataSourceManager.configure(prefix + file);</p><p style="TEXT-INDENT: 2em"> </p><p>        log.info("initialized successfully!");<br />    }</p><p style="TEXT-INDENT: 2em"> </p><p>    //Process the HTTP request<br />    public void service(HttpServletRequest request, HttpServletResponse response)<br />        throws ServletException, IOException<br />    {<br />        String reportClass = request.getParameter("reportClass");</p><p style="TEXT-INDENT: 2em"> </p><p>        log.debug("Running Report:" + reportClass);</p><p style="TEXT-INDENT: 2em"> </p><p>        boolean isExcelFormat = false;</p><p style="TEXT-INDENT: 2em"> </p><p>        if (reportClass == null)<br />        {<br />            throw new IllegalArgumentException("Jasper Class Unspecified");<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        String reportFormat = request.getParameter("reportFormat");</p><p style="TEXT-INDENT: 2em"> </p><p>        if (reportFormat == null)<br />        {<br />            reportFormat = "jasperPrint";<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        try<br />        {<br />            JasperReport myRpt = JasperManager.loadReport(this.getClass()<br />                                                              .getResourceAsStream("/jasperReports/" +<br />                        reportClass + ".jasper"));</p><p style="TEXT-INDENT: 2em"> </p><p>            //set ReprintHeaderOnEachPage=false for Excel Format<br />            isExcelFormat = reportFormat.equalsIgnoreCase("excel");</p><p style="TEXT-INDENT: 2em"> </p><p>            if (isExcelFormat)<br />            {<br />                //use reflect to set the private field of JRBaseReport<br />                //No margin for excel format, max pageHeight<br />                java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(<br />                        "leftMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0);</p><p style="TEXT-INDENT: 2em"> </p><p>                margin = JRBaseReport.class.getDeclaredField("topMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0);</p><p style="TEXT-INDENT: 2em"> </p><p>                margin = JRBaseReport.class.getDeclaredField("bottomMargin");<br />                margin.setAccessible(true);<br />                margin.setInt(myRpt, 0);</p><p style="TEXT-INDENT: 2em"> </p><p>                java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField(<br />                        "pageHeight");<br />                pageHeight.setAccessible(true);<br />                pageHeight.setInt(myRpt, Integer.MAX_VALUE);</p><p style="TEXT-INDENT: 2em"> </p><p>                //Don't print group header on each page<br />                if (null != myRpt.getGroups())<br />                {<br />                    for (int i = 0; i &lt; myRpt.getGroups().length; i++)<br />                    {<br />                        myRpt.getGroups()[i].setReprintHeaderOnEachPage(false);<br />                    }<br />                }<br />            }</p><p style="TEXT-INDENT: 2em"> </p><p>            Map params = new HashMap(10);<br />            Enumeration enu = request.getParameterNames();</p><p style="TEXT-INDENT: 2em"> </p><p>            while (enu.hasMoreElements())<br />            {<br />                String key = (String) enu.nextElement();<br />                params.put(key,<br />                    request.getParameter(key).toUpperCase().replaceAll("'", "''"));<br />                log.debug(key + "=" + request.getParameter(key));<br />            }</p><p style="TEXT-INDENT: 2em"> </p><p>            log.debug("Before Filling");</p><p style="TEXT-INDENT: 2em"> </p><p>            OutputStream httpOut = response.getOutputStream();</p><p style="TEXT-INDENT: 2em"> </p><p>            Connection conn = DataSourceManager.getConnection(request.getSession());</p><p style="TEXT-INDENT: 2em"> </p><p>            JasperPrint rptPnt = JasperManager.fillReport(myRpt, params, conn);</p><p style="TEXT-INDENT: 2em"> </p><p>            conn.close();</p><p style="TEXT-INDENT: 2em"> </p><p>            if (reportFormat.equalsIgnoreCase("jasperPrint"))<br />            {<br />                response.setContentType("application/octet-stream");<br />                JRSaver.saveObject(rptPnt, httpOut);<br />            }<br />            else if (reportFormat.equalsIgnoreCase("pdf"))<br />            {<br />                response.setContentType("application/pdf");<br />                response.setHeader("Content-Disposition",<br />                    "attachment;filename=\"" + reportClass + ".PDF\"");<br />                JasperManager.printReportToPdfStream(rptPnt, httpOut);<br />            }<br />            else if (reportFormat.equalsIgnoreCase("excel"))<br />            {<br />                response.setContentType("application/vnd.ms-excel");<br />                response.setHeader("Content-Disposition",<br />                    "attachment;filename=\"" + reportClass + ".XLS\"");</p><p style="TEXT-INDENT: 2em"> </p><p>                JRXlsExporter exporter = new JRXlsExporter();</p><p style="TEXT-INDENT: 2em"> </p><p>                exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);<br />                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);<br />                exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,<br />                    Boolean.TRUE);<br />                exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,<br />                    Boolean.FALSE);<br />                exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,<br />                    Boolean.FALSE);<br />                exporter.exportReport();<br />            }<br />            else if (reportFormat.equalsIgnoreCase("html"))<br />            {<br />                JRHtmlExporter exporter = new JRHtmlExporter();<br />                response.setContentType("text/html");</p><p style="TEXT-INDENT: 2em"> </p><p>                Map imagesMap = new HashMap();</p><p style="TEXT-INDENT: 2em"> </p><p>                request.getSession().setAttribute("IMAGES_MAP", imagesMap);</p><p style="TEXT-INDENT: 2em"> </p><p>                exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,<br />                    imagesMap);<br />                exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,<br />                    "image.jsp image=");<br />                exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);<br />                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);</p><p style="TEXT-INDENT: 2em"> </p><p>                exporter.exportReport();<br />            }</p><p style="TEXT-INDENT: 2em"> </p><p>            log.debug("Report Exported");<br />        }<br />        catch (Exception ex)<br />        {<br />            log.error("Error Occured", ex);<br />        }<br />    }<br />}<br /></p><p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p>/**<br /> * </p><p style="TEXT-INDENT: 2em"> </p><p>Title: JRDataSourceAdapter</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Description: Converting JRDataSource to Mapped ArrayList</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Copyright: Copyright (c) 2004</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Company: *****</p><br /> * @author zephyr<br /> * @version 1.0<br /> */<br />package xyz; 
<p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p>import net.sf.jasperreports.engine.*;<br />import net.sf.jasperreports.engine.design.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.util.*;</p><p style="TEXT-INDENT: 2em"> </p><p><br />public class JRDataSourceAdapter<br />{<br />    public static Map JRDataSource2Map(JRDataSource dataSource, String[] fieldNames,<br />        Class[] fieldClasses) throws JRException<br />    {<br />        HashMap result;</p><p style="TEXT-INDENT: 2em"> </p><p>        if (fieldNames.length != fieldClasses.length)<br />        {<br />            throw new JRException("Number of Field Name &amp; Class unmatch");<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        JRDesignField[] fields = new JRDesignField[fieldNames.length];</p><p style="TEXT-INDENT: 2em"> </p><p>        result = new HashMap(4);</p><p style="TEXT-INDENT: 2em"> </p><p>        for (int i = 0; i &lt; fieldNames.length; i++)<br />        {<br />            fields[i] = new JRDesignField();<br />            fields[i].setName(fieldNames[i]);<br />            fields[i].setValueClass(fieldClasses[i]);<br />            result.put(fieldNames[i], new ArrayList());<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        do<br />        {<br />            for (int i = 0; i &lt; fields.length; i++)<br />            {<br />                Object value = dataSource.getFieldValue(fields[i]);<br />                ((ArrayList) result.get(fields[i].getName())).add(value);<br />            }<br />        }<br />        while (dataSource.next());</p><p style="TEXT-INDENT: 2em"> </p><p>        return result;<br />    }<br />}<br /></p><p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p>/**<br /> * </p><p style="TEXT-INDENT: 2em"> </p><p>Title: GraphProvider</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Description: Generate JFreeChart Image</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Copyright: Copyright (c) 2004</p><br /> * 
<p style="TEXT-INDENT: 2em"> </p><p>Company: ****</p><br /> * @author zephyr <br /> * @version 1.0<br /> */<br />package xyz; 
<p style="TEXT-INDENT: 2em"> </p><p> </p><p style="TEXT-INDENT: 2em"> </p><p>import net.sf.jasperreports.engine.*;<br />import net.sf.jasperreports.engine.design.*;<br />import net.sf.jasperreports.engine.export.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import org.jfree.chart.*;<br />import org.jfree.chart.axis.*;<br />import org.jfree.chart.plot.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import org.jfree.data.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.awt.*;<br />import java.awt.image.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.io.*;</p><p style="TEXT-INDENT: 2em"> </p><p>import java.util.*;</p><p style="TEXT-INDENT: 2em"> </p><p><br />public class GraphProvider<br />{<br />    public static Image getImage(Map dataSource, String fieldNameX, String fieldNameY,<br />        String chartName, String titleX, String titleY, boolean isBarChart, int imageWidth,<br />        int imageHeight) throws JRException<br />    {<br />        JRDesignField fieldX = new JRDesignField();<br />        fieldX.setName(fieldNameX);<br />        fieldX.setValueClass(java.lang.String.class);</p><p style="TEXT-INDENT: 2em"> </p><p>        JRDesignField fieldY = new JRDesignField();<br />        fieldY.setName(fieldNameY);<br />        fieldY.setValueClass(java.lang.Double.class);</p><p style="TEXT-INDENT: 2em"> </p><p>        ArrayList periods = (ArrayList) dataSource.get(fieldNameX);<br />        ArrayList values = (ArrayList) dataSource.get(fieldNameY);</p><p style="TEXT-INDENT: 2em"> </p><p>        DefaultCategoryDataset categoryDs = new DefaultCategoryDataset();</p><p style="TEXT-INDENT: 2em"> </p><p>        for (int i = 0; i &lt; values.size(); i++)<br />        {<br />            Object obj = values.get(i);<br />            double dataValue = 0;</p><p style="TEXT-INDENT: 2em"> </p><p>            if (obj != null)<br />            {<br />                dataValue = ((Double) obj).doubleValue();<br />            }</p><p style="TEXT-INDENT: 2em"> </p><p>            categoryDs.addValue(dataValue, null, (String) periods.get(i));<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        JFreeChart c = null;</p><p style="TEXT-INDENT: 2em"> </p><p>        if (isBarChart)<br />        {<br />            c = ChartFactory.createBarChart(chartName, titleX, titleY, categoryDs,<br />                    PlotOrientation.VERTICAL, false, false, false);<br />        }<br />        else<br />        {<br />            c = ChartFactory.createLineChart(chartName, titleX, titleY, categoryDs,<br />                    PlotOrientation.VERTICAL, false, false, false);<br />        }</p><p style="TEXT-INDENT: 2em"> </p><p>        c.getTitle().setFont(new Font("Arial", Font.BOLD, 16));</p><p style="TEXT-INDENT: 2em"> </p><p>        NumberAxis axis = (NumberAxis) c.getCategoryPlot().getRangeAxis();<br />        axis.setAutoRange(true);</p><p style="TEXT-INDENT: 2em"> </p><p>        TickUnitSource tickUnits = NumberAxis.createIntegerTickUnits();<br />        axis.setStandardTickUnits(tickUnits);</p><p style="TEXT-INDENT: 2em"> </p><p>        return (c.createBufferedImage(imageWidth, imageHeight));</p><p style="TEXT-INDENT: 2em"> </p><p>       }<br />}<br /></p><img src ="http://www.blogjava.net/terrywu/aggbug/49461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2006-06-01 10:36 <a href="http://www.blogjava.net/terrywu/articles/49461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JfreeChart开发图表经验总结 </title><link>http://www.blogjava.net/terrywu/articles/49460.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Thu, 01 Jun 2006 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/49460.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/49460.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/49460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/49460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/49460.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 生成基于浏览器的图表方式比较多。据我所知道的，常用的有三种：																																				1、										      																												VML																				方式实现。这种方式是通过产生客户端的代码，由客户端根据代码生成相应...&nbsp;&nbsp;<a href='http://www.blogjava.net/terrywu/articles/49460.html'>阅读全文</a><img src ="http://www.blogjava.net/terrywu/aggbug/49460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2006-06-01 10:34 <a href="http://www.blogjava.net/terrywu/articles/49460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChart</title><link>http://www.blogjava.net/terrywu/articles/49430.html</link><dc:creator>吴志明</dc:creator><author>吴志明</author><pubDate>Thu, 01 Jun 2006 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/terrywu/articles/49430.html</guid><wfw:comment>http://www.blogjava.net/terrywu/comments/49430.html</wfw:comment><comments>http://www.blogjava.net/terrywu/articles/49430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrywu/comments/commentRss/49430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrywu/services/trackbacks/49430.html</trackback:ping><description><![CDATA[
		<pre>
				<div>
						<span style="FONT-WEIGHT: bold">一、jFreeChart产生图形的流程</span>
						<br />创建一个数据源（dataset）来包含将要在图形中显示的数据?????&gt;&gt;创建一个 JFreeChart 对象来代表要显示的图形 <br />??????&gt;&gt;把图形输出 <br />重要的类和接口： <br />org.jfree.data.general.Dataset 所有数据源类都要实现的接口 <br />org.jfree.chart.ChartFactory 由它来产生 JFreeChart 对象 <br />org.jfree.chart.JFreeChart 所有对图形的调整都是通过它噢！！ <br />org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它，然后再通过它对图形外部部分（例：坐标轴）调整 <br />注意：它有很多子类，一般都下嗍造型到它的子类！ <br />org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它，然后再通过它对图形内部部分 <br />（例：折线的类型）调整。同样，针对不同类型的报表图，它有 <br />着不同的子类实现！在下面我们简称它为 Renderer <br />下面我们结合不同类型的图形来具体分析这个流程。 <br /><br /><span style="FONT-WEIGHT: bold">二、饼图</span><br />饼图的dataset 一般是用PieDataset 接口，具体实现类是 DefaultPieDataset <br />1、创建一个数据源（dataset）： <br />private static PieDataset createDataset() <br />{ <br />DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDataset！！ <br />defaultpiedataset.setValue("One", new Double(43.200000000000003D)); <br />defaultpiedataset.setValue("Two", new Double(10D)); <br />defaultpiedataset.setValue("Three", new Double(27.5D)); <br />defaultpiedataset.setValue("Four", new Double(17.5D)); <br />return defaultpiedataset; <br />} <br />2、由ChartFactory 产生 JFreeChart 对象 <br />private static JFreeChart createChart(PieDataset piedataset) <br />{ <br />JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 1", //图形标题名称 <br />piedataset, // dataset <br />true, // legend? <br />true, // tooltips? <br />false); //URLs? <br />PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过JFreeChart 对象获得 plot：PiePlot！！ <br />pieplot.setNoDataMessage("No data available"); // 没有数据的时候显示的内容 <br />return jfreechart; <br />} <br />一些重要的方法： <br />pieplot.setExplodePercent(0,0.3D) //把Lable 为"One" 的那一块”挖“出来30% <br />3、输出略 <br /><br /><span style="FONT-WEIGHT: bold">三、柱状图</span><br />柱状图的dataset 一般是用CatagoryDataset接口(具体实现类是DefaultCategoryDataset),也会用 IntervalXYDataset <br />接口 <br />1、创建一个数据源（dataset）： <br />private static CategoryDataset createDataset() <br />{ <br />String series1 = "First"; <br />String series2 = "Second"; <br />String series3 = "Third"; <br />String category1 = "Category 1"; <br />String category2 = "Category 2"; <br />String category3 = "Category 3"; <br />String category4 = "Category 4"; <br />String category5 = "Category 5"; <br />DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset(); <br />defaultcategorydataset.addValue(1.0D, series1, category1); <br />defaultcategorydataset.addValue(4D, series1, category2); <br />defaultcategorydataset.addValue(3D, series1, category3); <br />defaultcategorydataset.addValue(5D, series1, category4); <br />defaultcategorydataset.addValue(5D, series1, category5); <br /><br />defaultcategorydataset.addValue(5D, series2, category1); <br />defaultcategorydataset.addValue(7D, series2, category2); <br />defaultcategorydataset.addValue(6D, series2, category3); <br />defaultcategorydataset.addValue(8D, series2, category4); <br />defaultcategorydataset.addValue(4D, series2, category5); <br /><br />defaultcategorydataset.addValue(4D, series3, category1); <br />defaultcategorydataset.addValue(3D, series3, category2); <br />defaultcategorydataset.addValue(2D, series3, category3); <br />defaultcategorydataset.addValue(3D, series3, category4); <br />defaultcategorydataset.addValue(6D, series3, category5); <br />return defaultcategorydataset; <br />} <br />2、由ChartFactory 产生 JFreeChart 对象 <br />private static JFreeChart createChart(CategoryDataset categorydataset) <br />{ <br />JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo", //图形标题名称 <br />"Category",//domain 轴 Lable <br />这里先简单理解为横坐标Lable好了 <br />"Value", //range 轴 Lable <br />这里也先简单理解为纵坐标Lable好了 <br />categorydataset, // dataset <br />PlotOrientation.VERTICAL, //垂直显示 <br />true, // legend? <br />true, // tooltips? <br />false); //URLs? <br />jfreechart.setBackgroundPaint(Color.white); //设定背景色为白色 <br />CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //获得 plot：CategoryPlot！！ <br />categoryplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色 <br />categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色 <br />categoryplot.setDomainGridlinesVisible(true); //可见 <br />categoryplot.setRangeGridlinePaint(Color.white); //纵坐标网格线白色 <br />//下面两行使纵坐标的最小单位格为整数 <br />NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis(); <br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); <br />BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意这里是下嗍造型 <br />到BarRenderer！！ <br />barrenderer.setDrawBarOutline(false); // Bar的外轮廓线不画 <br />GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue, <br />0.0F, 0.0F, new Color(0, 0, 64)); //设定特定颜色 <br />GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green, <br />0.0F, 0.0F, new Color(0, 64, 0)); <br />GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red, <br />0.0F, 0.0F, new Color(64, 0, 0)); <br />barrenderer.setSeriesPaint(0, gradientpaint); //给series1 Bar设定上面定义的颜色 <br />barrenderer.setSeriesPaint(1, gradientpaint1); //给series2 Bar 设定上面定义的颜色 <br />barrenderer.setSeriesPaint(2, gradientpaint2); //给series3 Bar 设定上面定义的颜色 <br />CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //横轴上的 Lable 45度倾斜 <br />categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); <br />return jfreechart; <br />} <br />一些重要的方法：（增加一块标记） <br />IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D); <br />intervalmarker.setLabel("Target Range"); <br />intervalmarker.setLabelFont(new Font("SansSerif", 2, 11)); <br />intervalmarker.setLabelAnchor(RectangleAnchor.LEFT); <br />intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT); <br />intervalmarker.setPaint(new Color(222, 222, 255, 128)); <br />categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND); <br /><br /><span style="FONT-WEIGHT: bold">四、折线图</span><br />折线图的dataset 两种CatagoryDataset接口(具体实现类是DefaultCategoryDataset),XYDataset 接口 <br />1、CatagoryDataset接口： <br />A、创建一个数据源（dataset）： <br />private static CategoryDataset createDataset() <br />{ <br />String series1 = "First"; <br />String series2 = "Second"; <br />String series3 = "Third"; <br />String type1 = "Type 1"; <br />String type2 = "Type 2"; <br />String type3 = "Type 3"; <br />String type4 = "Type 4"; <br />String type5 = "Type 5"; <br />String type6 = "Type 6"; <br />String type7 = "Type 7"; <br />String type8 = "Type 8"; <br />DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset(); <br />defaultcategorydataset.addValue(1.0D, series1, type1); <br />defaultcategorydataset.addValue(4D, series1, type2); <br />defaultcategorydataset.addValue(3D, series1, type3); <br />defaultcategorydataset.addValue(5D, series1, type4); <br />defaultcategorydataset.addValue(5D, series1, type5); <br />defaultcategorydataset.addValue(7D, series1, type6); <br />defaultcategorydataset.addValue(7D, series1, type7); <br />defaultcategorydataset.addValue(8D, series1, type8); <br /><br />defaultcategorydataset.addValue(5D, series2, type1); <br />defaultcategorydataset.addValue(7D, series2, type2); <br />defaultcategorydataset.addValue(6D, series2, type3); <br />defaultcategorydataset.addValue(8D, series2, type4); <br />defaultcategorydataset.addValue(4D, series2, type5); <br />defaultcategorydataset.addValue(4D, series2, type6); <br />defaultcategorydataset.addValue(2D, series2, type7); <br />defaultcategorydataset.addValue(1.0D, series2, type8); <br /><br />defaultcategorydataset.addValue(4D, series3, type1); <br />defaultcategorydataset.addValue(3D, series3, type2); <br />defaultcategorydataset.addValue(2D, series3, type3); <br />defaultcategorydataset.addValue(3D, series3, type4); <br />defaultcategorydataset.addValue(6D, series3, type5); <br />defaultcategorydataset.addValue(3D, series3, type6); <br />defaultcategorydataset.addValue(4D, series3, type7); <br />defaultcategorydataset.addValue(3D, series3, type8); <br />return defaultcategorydataset; <br />} <br />B、由ChartFactory 产生 JFreeChart 对象 (与上面重复的部分就不再注释） <br />private static JFreeChart createChart(CategoryDataset categorydataset) <br />{ <br />JFreeChart jfreechart = ChartFactory.createLineChart("Line Chart Demo 1", <br />"Type", <br />"Value", <br />categorydataset, <br />PlotOrientation.VERTICAL, <br />true, <br />true, <br />false); <br />jfreechart.setBackgroundPaint(Color.white); <br />CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot(); <br />categoryplot.setBackgroundPaint(Color.lightGray); <br />categoryplot.setRangeGridlinePaint(Color.white); <br />NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis(); <br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); <br />numberaxis.setAutoRangeIncludesZero(true); <br />//获得renderer 注意这里是下嗍造型到lineandshaperenderer！！ <br />LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer(); <br />lineandshaperenderer.setShapesVisible(true); //series 点（即数据点）可见 <br />lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { <br />10F, 6F <br />}, 0.0F)); //定义series为"First"的（即series1）点之间的连线 ，这里是虚线，默认是直线 <br />lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { <br />6F, 6F <br />}, 0.0F)); //定义series为"Second"的（即series2）点之间的连线 <br />lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { <br />2.0F, 6F <br />}, 0.0F)); //定义series为"Third"的（即series3）点之间的连线 <br />return jfreechart; <br />} <br />一些重要的方法： <br />lineandshaperenderer.setLineVisible(true) //series 点（即数据点）间有连线可见 <br />2、XYDataset 接口： <br />A、创建一个数据源（dataset）： <br />private static XYDataset createDataset() <br />{ <br />XYSeries xyseries = new XYSeries("First"); //先产生XYSeries 对象 <br />xyseries.add(1.0D, 1.0D); <br />xyseries.add(2D, 4D); <br />xyseries.add(3D, 3D); <br />xyseries.add(4D, 5D); <br />xyseries.add(5D, 5D); <br />xyseries.add(6D, 7D); <br />xyseries.add(7D, 7D); <br />xyseries.add(8D, 8D); <br /><br />XYSeries xyseries1 = new XYSeries("Second"); <br />xyseries1.add(1.0D, 5D); <br />xyseries1.add(2D, 7D); <br />xyseries1.add(3D, 6D); <br />xyseries1.add(4D, 8D); <br />xyseries1.add(5D, 4D); <br />xyseries1.add(6D, 4D); <br />xyseries1.add(7D, 2D); <br />xyseries1.add(8D, 1.0D); <br /><br />XYSeries xyseries2 = new XYSeries("Third"); <br />xyseries2.add(3D, 4D); <br />xyseries2.add(4D, 3D); <br />xyseries2.add(5D, 2D); <br />xyseries2.add(6D, 3D); <br />xyseries2.add(7D, 6D); <br />xyseries2.add(8D, 3D); <br />xyseries2.add(9D, 4D); <br />xyseries2.add(10D, 3D); <br /><br />XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //再用XYSeriesCollection添加入XYSeries 对象 <br />xyseriescollection.addSeries(xyseries); <br />xyseriescollection.addSeries(xyseries1); <br />xyseriescollection.addSeries(xyseries2); <br />return xyseriescollection; <br />} <br />B、由ChartFactory 产生 JFreeChart 对象 <br />private static JFreeChart createChart(XYDataset xydataset) <br />{ <br />JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2", <br />"X", <br />"Y", <br />xydataset, <br />PlotOrientation.VERTICAL, <br />true, <br />true, <br />false); <br />jfreechart.setBackgroundPaint(Color.white); <br />XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot：XYPlot！！ <br />xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色 <br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离 <br />xyplot.setDomainGridlinePaint(Color.white); //网格线颜色 <br />xyplot.setRangeGridlinePaint(Color.white); <br />//获得 renderer 注意这里是XYLineAndShapeRenderer ！！ <br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer(); <br />xylineandshaperenderer.setShapesVisible(true); //数据点可见 <br />xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点 <br />NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis(); <br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); <br />return jfreechart; <br />} <br />一些重要的方法： <br />XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(); <br />xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一个XYSeries数据点间连线不可见 <br />xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二个XYSeries数据点不可见 <br />xyplot.setRenderer(xylineandshaperenderer); <br /><br /><span style="FONT-WEIGHT: bold">五、时间序列图</span><br />时间序列图和折线图很相似，不同的是它在 domain轴的数据是时间而不是数字。 时间序列图的dataset 是 <br />XYDataset 接口，具体实现类是TimeSeriesCollection ，和上面类似，有TimeSeries 对象，它被添加入 <br />TimeSeriesCollection 。 <br />1、创建一个数据源（dataset）： <br />private static XYDataset createDataset() <br />{ <br />TimeSeries timeseries = new TimeSeries("L&amp;G European Index Trust",Month.class); <br />timeseries.add(new Month(2, 2001), 181.8D);//这里用的是Month.class，同样还有Day.class Year.class 等等 <br />timeseries.add(new Month(3, 2001), 167.3D); <br />timeseries.add(new Month(4, 2001), 153.8D); <br />timeseries.add(new Month(5, 2001), 167.6D); <br />timeseries.add(new Month(6, 2001), 158.8D); <br />timeseries.add(new Month(7, 2001), 148.3D); <br />timeseries.add(new Month(8, 2001), 153.9D); <br />timeseries.add(new Month(9, 2001), 142.7D); <br />timeseries.add(new Month(10, 2001), 123.2D); <br />timeseries.add(new Month(11, 2001), 131.8D); <br />timeseries.add(new Month(12, 2001), 139.6D); <br />timeseries.add(new Month(1, 2002), 142.9D); <br />timeseries.add(new Month(2, 2002), 138.7D); <br />timeseries.add(new Month(3, 2002), 137.3D); <br />timeseries.add(new Month(4, 2002), 143.9D); <br />timeseries.add(new Month(5, 2002), 139.8D); <br />timeseries.add(new Month(6, 2002), 137D); <br />timeseries.add(new Month(7, 2002), 132.8D); <br /><br />TimeSeries timeseries1 = new TimeSeries("L&amp;G UK Index Trust",Month.class); <br />timeseries1.add(new Month(2, 2001), 129.6D); <br />timeseries1.add(new Month(3, 2001), 123.2D); <br />timeseries1.add(new Month(4, 2001), 117.2D); <br />timeseries1.add(new Month(5, 2001), 124.1D); <br />timeseries1.add(new Month(6, 2001), 122.6D); <br />timeseries1.add(new Month(7, 2001), 119.2D); <br />timeseries1.add(new Month(8, 2001), 116.5D); <br />timeseries1.add(new Month(9, 2001), 112.7D); <br />timeseries1.add(new Month(10, 2001), 101.5D); <br />timeseries1.add(new Month(11, 2001), 106.1D); <br />timeseries1.add(new Month(12, 2001), 110.3D); <br />timeseries1.add(new Month(1, 2002), 111.7D); <br />timeseries1.add(new Month(2, 2002), 111D); <br />timeseries1.add(new Month(3, 2002), 109.6D); <br />timeseries1.add(new Month(4, 2002), 113.2D); <br />timeseries1.add(new Month(5, 2002), 111.6D); <br />timeseries1.add(new Month(6, 2002), 108.8D); <br />timeseries1.add(new Month(7, 2002), 101.6D); <br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); <br />timeseriescollection.addSeries(timeseries); <br />timeseriescollection.addSeries(timeseries1); <br />timeseriescollection.setDomainIsPointsInTime(true); //domain轴上的刻度点代表的是时间点而不是时间段 <br />return timeseriescollection; <br />} <br />2、由ChartFactory 产生 JFreeChart 对象 <br />private static JFreeChart createChart(XYDataset xydataset) <br />{ <br />JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal &amp; General Unit Trust Prices", <br />"Date", <br />"Price Per Unit", <br />xydataset, <br />true, <br />true, <br />false); <br />jfreechart.setBackgroundPaint(Color.white); <br />XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!! <br />xyplot.setBackgroundPaint(Color.lightGray); <br />xyplot.setDomainGridlinePaint(Color.white); <br />xyplot.setRangeGridlinePaint(Color.white); <br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); <br />xyplot.setDomainCrosshairVisible(true); <br />xyplot.setRangeCrosshairVisible(true); <br />org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer(); <br />if(xyitemrenderer instanceof XYLineAndShapeRenderer) <br />{ <br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer; <br />xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可见 <br />xylineandshaperenderer.setDefaultShapesFilled(true); //数据点是实心点 <br />} <br />DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期显示格式定义 <br />dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy")); <br />return jfreechart; <br />} <br />一些重要的方法： <br />A、增加标记线： <br />xyplot.addRangeMarker(new ValueMarker(550D)); //数值轴 <br />Quarter quarter = new Quarter(2, 2002); <br />xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //时间轴 <br />B、数据点的调整 <br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer(); <br />xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可见 <br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //数据点填充为红色 <br />xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //数据点填充为白色 <br />xylineandshaperenderer.setUseFillPaint(true); //应用 <br />C、平均值曲线 <br />这个曲线有什么用呢？很简单的例子，这里有一个以半年每天为单位的数据绘制的曲线，我们想看看以月为单位数据 <br />的变化，这时就可以用到它了。 <br />TimeSeries timeseries = createEURTimeSeries(); //就是以半年每天为单位的数据 <br />TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries, <br />"30 day moving average", <br />30, //30天为一个周期 <br />30); //最开始的30天跳过 <br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); <br />timeseriescollection.addSeries(timeseries); <br />timeseriescollection.addSeries(timeseries1); <br />return timeseriescollection; <br /><br /><span style="FONT-WEIGHT: bold">六、总结一下</span><br />dataset plot renderer <br />饼图 PieDataset（DefaultPieDataset） PiePlot ------ <br />柱状图 CatagoryDataset（DefaultCategoryDataset） CategoryPlot BarRenderer <br />折线图 CatagoryDataset（DefaultCategoryDataset） CategoryPlot LineAndShapeRenderer <br />XYDataset（XYSeriesCollection） XYPlot XYLineAndShapeRenderer <br />时间序列图 XYDataset （TimeSeriesCollection） XYPlot XYLineAndShapeRenderer <br />这里只是一些常用的方法，具体还是看API <br /><span style="FONT-WEIGHT: bold">七、Item Lable</span><br />这里以柱状图为例说明，具体来说就是在每个柱状上显示它的数据，具体有下面内容： <br />A、使 Item Lable 可见 <br />B、调整 Item Lable 的颜色、字体等 <br />C、调整 Item Lable 的位置 <br />D、定制 Item Lable 的内容 <br />1、分配一个 Lable Generator 给 renderer <br />BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); <br />GategoryLableGenerator generator =new StandardGategoryLableGenerator( <br />"{2}", new DecimalFormat("0.00") //调整显示的数字和字符格式 <br />); <br />barrenderer.setLableGenerator(generator); <br />2、使 Item Lable 可见 <br />barrenderer.setItemLableVisible(true); <br />3、调整 Item Lable 的颜色、字体等 <br />barrenderer.setItemLablePaint(Color.red); <br />barrenderer.setItemLableFont(new Font("SansSerif",Font.PLAIN,10)); <br />4、调整 Item Lable 的位置 <br />这里涉及到一个新的对象 ItemLablePosition , ItemLablePosition的构造函数有两个或四个参数 <br />public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor, <br />org.jfree.ui.TextAnchor textAnchor, <br />org.jfree.ui.TextAnchor rotationAnchor, <br />double angle) <br />itemLabelAnchor - Item Lable 的位置 （最重要的！！） <br />textAnchor - Item Lable里包含的正文相对于Item Lable 的位置 <br />rotationAnchor - Item Lable里包含的正文旋转的位置 <br />angle - 旋转的角度 <br />ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12, <br />TextAnchor.CENTER_RIGHT, <br />TextAnchor.CENTER_RIGHT, <br />-1.57D); <br />barrenderer.setPositiveItemLabelPosition(itemlabelposition); <br />这样就可以每个柱状上显示它的数据了，当然可以定制 Item Lable 的内容，比如 Item Lable text 超过100的才 <br />显示，这样就需要定制自己的类，它要实现GategoryLableGenerator 接口，实现generateItemLable()方法</div>
				<div>
				</div>
		</pre>
<img src ="http://www.blogjava.net/terrywu/aggbug/49430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrywu/" target="_blank">吴志明</a> 2006-06-01 10:12 <a href="http://www.blogjava.net/terrywu/articles/49430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>