??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区.www,禁断一区二区三区在线,婷婷国产在线http://www.aygfsteel.com/terrywu/category/11704.htmlzh-cnFri, 23 Mar 2007 11:23:24 GMTFri, 23 Mar 2007 11:23:24 GMT60jfreecahrt1.0 中文API http://www.aygfsteel.com/terrywu/articles/105618.html吴志?/dc:creator>吴志?/author>Thu, 22 Mar 2007 10:06:00 GMThttp://www.aygfsteel.com/terrywu/articles/105618.htmlhttp://www.aygfsteel.com/terrywu/comments/105618.htmlhttp://www.aygfsteel.com/terrywu/articles/105618.html#Feedback0http://www.aygfsteel.com/terrywu/comments/commentRss/105618.htmlhttp://www.aygfsteel.com/terrywu/services/trackbacks/105618.html

jfreechart目前最高版本ؓ1.0.0?http://www.jfree.org/jfreechart/index.html)。可以绘?br />pie charts 饼图,bar charts q?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核心cd介绍Q?br />jfreechart主要׃个大的包l成Qorg.jfree.chart,org.jfree.data。其中前者主要与囑Ş
本n有关Q后者与囑Ş昄的数据有兟?br />核心cM要有Q?br />org.jfree.chart.JFreeChartQ图表对象,Mcd的图表的最l表现Ş式都是在该对象进行一些属性的定制。JFreeChart引擎本n提供了一个工厂类用于创徏不同cd的图表对?br />org.jfree.data.category.XXXDataSet:数据集对象,用于提供昄图表所用的数据。根据不同类型的图表对应着很多cd的数据集对象c?br />org.jfree.chart.plot.XXXPlotQ图表区域对象,基本上这个对象决定着什么样式的图表Q创对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.XXXAxisQ用于处理图表的两个_Uu和横?br />org.jfree.chart.render.XXXRenderQ负责如何显CZ个图表对?br />org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator:用于生成图象的帮助提C,不同cd图表对应不同cd的工hC类
对于常用的饼Nq图,比较单而且|上有很多的文章介绍Q在q里׃再一一复述了,
(可以参考这文章http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc&me=ccidQ?br />主要说明下另一U常见的报表Q时序图Q首先声明一个曲U数据集合对象和曲线对象

TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();
//声明具体是曲U对象,(可根据实际情况在同一张图中显C多条曲U进行数据比对,Ҏ实际应用情况当超q?条曲U时Q就会有些ؕ?
TimePeriodValues timeperiod1 = new TimePeriodValues("服务器A在线用户数量");
TimePeriodValues timeperiod2 = new TimePeriodValues("服务器B在线用户数量");
我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();
TimeSeries ts = new TimeSeries();
在生成数据集Ӟts.add(new Day(day, month, year),10))Q只能生成最单位ؓ天的横u所以改用了TimePeriodValuesCollection
//Ҏ当前旉取得横u坐标Q时间间隔ؓ1时
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
//q里改ؓҎ自己E序得到的需要显C的旉点和对应的数据的集合;
List objectList1 = dao.getList1();
List objectList2 = dao.getList2();
//使用循环Q把x_y轴的Dltimeseries1
for (int i =0;i<objecthash1.size();i++) {
    int hour = objecthash1[i].getHours();
    int count = objecthash1[i].getCount();
 //每一Ҏ据(旉Q数|d到数据集?(曲线对象1)?br />    timeseries1.add(new Hour(hour, day, month, year),count);
}
for (int i =0;i<objecthash2.size();i++) {
    int hour = objecthash2[i].getHours();
    int count = objecthash2[i].getCount();
 //每一Ҏ据(旉Q数|d到数据集?(曲线对象2)?br />    timeseries2.add(new Hour(hour, day, month, year),count);
}
//曲U对象添加到曲线数据集合对象?br />timeseriescollection.addSeries(timeseries1);
timeseriescollection.addSeries(timeseries2);
//l制报表
String title = "日在U用L?; //报表标题
String domain = "旉";    //x?br />String range = "用户在线数量";   //y?br />//创徏旉序列囑֯?br />JFreeChart chart = ChartFactory.createTimeSeriesChart(
title,  //报表标题
domain, //报表横u标签
range,  //报表Uu标签
timeseriescollection, //数据集合
true,  //是否昄图例,在这里如果ؓtrue则会在图表的下方昄各条数据曲线的名U和颜色
false, // 是否生成工具
false   // 是否生成URL链接);
//报表保存ؓjpg文g
ChartUtilities.saveChartAsJPEG(file, //文g保存物理路径包括路径和文件名
100,   //囄质量
chart, //图表对象
1024,  //囑փ宽度
768,   //囑փ高度
null); //昄信息
//报表直接在面输出
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);

String title="月在U用L?;  //标题
String domain="旉(?";//x?br />String range="用户在线数量";//y?
TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();
TimePeriodValues timeseries = new TimePeriodValues( "用户数量");
 timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);
 timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);
 timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);
 timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);
JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);
当我们生成了一个报表对象时Q可能需要根据实际情冉|军_报表的横轴和Uu的数值间隔,昄方式{?br />可以用XYPlot xyplot = (XYPlot)chart.getPlot();来得到所有数据点的集合。(其它形状图表得到的数据集对象Ҏ实际情况造型Q?br />得到数据炚w合后Q我们就可以讄各条曲线的颜Ԍ和坐标u的距,x轴、y轴的昄方式{等属?br />xyplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //讑֮坐标轴与图表数据昄部分距离
xyplot.setDomainGridlinePaint(Color.white); //|格U纵向颜?br />xyplot.setRangeGridlinePaint(Color.white); //|格U横向颜?br />数据点的调整
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true);  //数据点可?br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //讄W一条曲U数据点填充为红Ԍ如果一个图表有多条曲线可分别设|?br />xylineandshaperenderer.setUseFillPaint(true);    //应用

使用xyplot.getRangeAxis()得到UuQxyplot.getDomainAxis()得到横uQ得到后可以Ҏ实际情况造型己所需要的cd?br />我的图表Uu为数值类型,横u为时间类型,使用如下方式
NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();
DateAxis  dateaxis =   (DateAxis)xyplot.getDomainAxis();
//讄y昄方式
numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动定
double  rangetick = 0.1D;
numAxis.setTickUnit(new NumberTickUnit(rangetick));  //y轴单位间隔ؓ0.1
//讄x轴显C方?br />dateaxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动定
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x轴单位间隔ؓ1?br />我们q可以是数据格式化以后昄Q比如y轴显C百分比Q?0%?00%Q?x轴显CZؓ×月×日
NumberFormat nf =NumberFormat.getPercentInstance();
numAxis.setNumberFormatOverride(nf);//讄y轴以癑ֈ比方式显C?br />SimpleDateFormat format = new SimpleDateFormat("MM月dd");
dateaxis.setDateFormatOverride(format);//讄x轴数据单位以×月×日方式昄
时序图中q有一个很重要的方?br />timeseriescollection.setDomainIsPointsInTime(true); //x轴上的刻度点代表的是旉点而不是时间段
最开始我没有讄q个属?l果d来的图,老是差半g能在q个d的时候准显C,往后移了半|是因ؓJFreeChart默认q个d?br />一个时间段Q它把这个刻度和下个d的中间点认ؓ是显C数据点最佳位|?br />
其他一些关于AXIScȝҎQ?br />Axisc:
void setVisible(boolean flag)坐标轴是否可?br />void setAxisLinePaint(Paint paint)坐标轴线条颜Ԍ3D轴无效)
void setAxisLineStroke(Stroke stroke)坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible)坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension)Q用于复合表中对多坐标u的设|)
void setLabel(String label)坐标轴标?br />void setLabelFont(Font font)坐标轴标题字?br />void setLabelPaint(Paint paint)坐标轴标题颜?br />void setLabelAngle(double angle)`坐标轴标题旋转角度(U坐标可以旋转)
void setTickLabelFont(Font font)坐标轴标值字?br />void setTickLabelPaint(Paint paint)坐标轴标值颜?br />void setTickLabelsVisible(boolean flag)坐标轴标值是否显C?br />void setTickMarkPaint(Paint paint)坐标轴标颜?br />void setTickMarkStroke(Stroke stroke)坐标轴标笔?br />void setTickMarksVisible(boolean flag)坐标轴标是否显C?br />ValueAxis(Axis)c:
void setAutoRange(boolean auto)自动讄数据轴数据范?br />void setAutoRangeMinimumSize(double size)自动讄数据轴数据范围时数据范围的最跨?br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动定Q默认ؓtrueQ?br />void setFixedAutoRange(double length)数据轴固定数据范_讄100的话是昄MAXVALUE到MAXVALUE-100那段数据范围Q?br />void setInverted(boolean flag)数据轴是否反向(默认为falseQ?br />void setLowerMargin(double margin)数据轴下Q左Q边?br />void setUpperMargin(double margin)数据轴上Q右Q边?br />void setLowerBound(double min)数据轴上的显C最?br />void setUpperBound(double max)数据轴上的显C最大?br />void setPositiveArrowVisible(boolean visible)是否昄正向头Q?D轴无效)
void setNegativeArrowVisible(boolean visible)是否昄反向头Q?D轴无效)
void setVerticalTickLabels(boolean flag)数据轴数据标{是否旋转到垂直
void setStandardTickUnits(TickUnitSource source)数据轴的数据标签Q可以只昄整数标签Q需要将AutoTickUnitSelection设falseQ?br />NumberAxis(ValueAxis)c:
void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag)是否强制在整个数据u中包?Q即?不在数据范围?br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标{昄格式
void setTickUnit(NumberTickUnit unit)数据轴的数据标签Q需要将AutoTickUnitSelection设falseQ?br />DateAxis(ValueAxis)c:
void setMaximumDate(Date maximumDate)日期轴上的最日?br />void setMinimumDate(Date minimumDate)日期轴上的最大日?br />void setRange(Date lower,Date upper)日期轴范?br />void setDateFormatOverride(DateFormat formatter)日期轴日期标{昄格式
void setTickUnit(DateTickUnit unit)日期轴的日期标签Q需要将AutoTickUnitSelection设falseQ?br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置Q参数常量在org.jfree.chart.axis.DateTickMarkPositioncM定义Q?br />CategoryAxis(Axis)c:
void setCategoryMargin(double margin)分类轴边?br />void setLowerMargin(double margin)分类轴下Q左Q边?br />void setUpperMargin(double margin)分类轴上Q右Q边?br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio)分类轴分cL{最大宽?br />jfreechart 讄技?br />
1.横坐标内容竖? 
      XYPlot xyplot = jfreechart.getXYPlot();
        DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();
        dateaxis.setTickUnit(new DateTickUnit(1, 1, new SimpleDateFormat("MMM-yyyy")));
        dateaxis.setVerticalTickLabels(true);

2.讄最大坐标范?br /> 1QValueAxis axis = xyplot.getRangeAxis() ;
       axis.setRange(0,100) ;
       xyplot.setRangeAxis(axis);

  2Qnumberaxis1.setUpperBound(6500D);//最大?br />     numberaxis1.setLowerBound(5500D);//最?br />2.讄旉轴的间隔旉
    dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//讄旉间隔Z?br />学JFreeChart不得不看的中文API

JFreeChartc:
void setAntiAlias(boolean flag)字体模糊边界
void setBackgroundImage(Image image)背景囄
void setBackgroundImageAlignment(int alignment)背景囄寚w方式Q参数常量在org.jfree.ui.AligncM定义Q?br />void setBackgroundImageAlpha(float alpha)背景囄透明度(0.0?.0Q?br />void setBackgroundPaint(Paint paint)背景?br />void setBorderPaint(Paint paint)边界U条颜色
void setBorderStroke(Stroke stroke)边界U条W触
void setBorderVisible(boolean visible)边界U条是否可见

-----------------------------------------------------------------------------------------------------------

TextTitlec:
void setFont(Font font)标题字体
void setPaint(Paint paint)标题字体颜色
void setText(String text)标题内容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)c:
void setBackgroundPaint(Paint paint)囄背景?br />void setTitle(String title)囄标题内容
void setTitleFont(Font font)囄标题字体
void setBoundingBoxArcWidth(int arcWidth)囄边界圆角?br />void setBoundingBoxArcHeight(int arcHeight)囄边界圆角?br />void setOutlinePaint(Paint paint)囄边界U条颜色
void setOutlineStroke(Stroke stroke)囄边界U条W触
void setDisplaySeriesLines(boolean flag)囄Ҏ否显C横U(折线图有效)
void setDisplaySeriesShapes(boolean flag)囄Ҏ否显CŞӞ折线图有效)
void setItemFont(Font font)囄字?br />void setItemPaint(Paint paint)囄字体颜?br />void setAnchor(int anchor)囄在图表中的显CZ|(参数帔R在LegendcM定义Q?br />
Axisc:
void setVisible(boolean flag)坐标轴是否可?br />void setAxisLinePaint(Paint paint)坐标轴线条颜Ԍ3D轴无效)
void setAxisLineStroke(Stroke stroke)坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible)坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension)Q用于复合表中对多坐标u的设|)
void setLabel(String label)坐标轴标?br />void setLabelFont(Font font)坐标轴标题字?br />void setLabelPaint(Paint paint)坐标轴标题颜?br />void setLabelAngle(double angle)`坐标轴标题旋转角度(U坐标可以旋转)
void setTickLabelFont(Font font)坐标轴标值字?br />void setTickLabelPaint(Paint paint)坐标轴标值颜?br />void setTickLabelsVisible(boolean flag)坐标轴标值是否显C?br />void setTickMarkPaint(Paint paint)坐标轴标颜?br />void setTickMarkStroke(Stroke stroke)坐标轴标笔?br />void setTickMarksVisible(boolean flag)坐标轴标是否显C?br />
ValueAxis(Axis)c:
void setAutoRange(boolean auto)自动讄数据轴数据范?br />void setAutoRangeMinimumSize(double size)自动讄数据轴数据范围时数据范围的最跨?br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动定Q默认ؓtrueQ?br />void setFixedAutoRange(double length)数据轴固定数据范_讄100的话是昄MAXVALUE到MAXVALUE-100那段数据范围Q?br />void setInverted(boolean flag)数据轴是否反向(默认为falseQ?br />void setLowerMargin(double margin)数据轴下Q左Q边?br />void setUpperMargin(double margin)数据轴上Q右Q边?br />void setLowerBound(double min)数据轴上的显C最?br />void setUpperBound(double max)数据轴上的显C最大?br />void setPositiveArrowVisible(boolean visible)是否昄正向头Q?D轴无效)
void setNegativeArrowVisible(boolean visible)是否昄反向头Q?D轴无效)
void setVerticalTickLabels(boolean flag)数据轴数据标{是否旋转到垂直
void setStandardTickUnits(TickUnitSource source)数据轴的数据标签Q可以只昄整数标签Q需要将AutoTickUnitSelection设falseQ?br />
NumberAxis(ValueAxis)c:
void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag)是否强制在整个数据u中包?Q即?不在数据范围?br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标{昄格式
void setTickUnit(NumberTickUnit unit)数据轴的数据标签Q需要将AutoTickUnitSelection设falseQ?br />
DateAxis(ValueAxis)c:
void setMaximumDate(Date maximumDate)日期轴上的最日?br />void setMinimumDate(Date minimumDate)日期轴上的最大日?br />void setRange(Date lower,Date upper)日期轴范?br />void setDateFormatOverride(DateFormat formatter)日期轴日期标{昄格式
void setTickUnit(DateTickUnit unit)日期轴的日期标签Q需要将AutoTickUnitSelection设falseQ?br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置Q参数常量在org.jfree.chart.axis.DateTickMarkPositioncM定义Q?br />
CategoryAxis(Axis)c:
void setCategoryMargin(double margin)分类轴边?br />void setLowerMargin(double margin)分类轴下Q左Q边?br />void setUpperMargin(double margin)分类轴上Q右Q边?br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio)分类轴分cL{最大宽?br />
AbstractRendererc:
void setItemLabelAnchorOffset(double offset)数据标签的与数据点的偏移
void setItemLabelsVisible(boolean visible)数据标签是否可见
void setItemLabelFont(Font font)数据标签的字?br />void setItemLabelPaint(Paint paint)数据标签的字体颜?br />void setItemLabelPosition(ItemLabelPosition position)数据标签位置
void setPositiveItemLabelPosition(ItemLabelPosition position)正数标签位置
void setNegativeItemLabelPosition(ItemLabelPosition position)负数标签位置
void setOutLinePaint(Paint paint)囑ŞҎ的线条颜?br />void setOutLineStroke(Stroke stroke)囑ŞҎ的线条笔?br />void setPaint(Paint paint)所有分cd形的颜色
void setShape(Shape shape)所有分cd形的形状Q如折线囄点)
void setStroke(Stroke stroke)所有分cd形的W触Q如折线囄U)
void setSeriesItemLabelsVisible(int series,boolean visible)指定分类的数据标{是否可?br />void setSeriesItemLabelFont(int series,Font font)指定分类的数据标{字体
void setSeriesItemLabelPaint(int series,Paint paint)指定分类的数据标{字体颜色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position)数据标签位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position)正数标签位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position)负数标签位置
void setSeriesOutLinePaint(int series,Paint paint)指定分类的图形边框的U条颜色
void setSeriesOutLineStroke(int series,Stroke stroke)指定分类的图形边框的U条W触
void setSeriesPaint(int series,Paint paint)指定分类囑Ş的颜?br />void setSeriesShape(int series,Shape shape)指定分类囑Ş的ŞӞ如折U图的点Q?br />void setSeriesStroke(int series,Stroke stroke)指定分类囑Ş的笔触(如折U图的线Q?br />
AbstractCategoryItemRenderer(AbstractRenderer)c:
void setLabelGenerator(CategoryLabelGenerator generator)数据标签的格?br />void setToolTipGenerator(CategoryToolTipGenerator generator)MAP中鼠标移上的昄格式
void setItemURLGenerator(CategoryURLGenerator generator)MAP中钻取链接格?br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator)指定分类的数据标{格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator)指定分类的MAP中鼠标移上的昄格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator)指定分类的MAP中钻取链接格?br />
BarRenderer(AbstractCategoryItemRenderer)c:
void setDrawBarOutline(boolean draw)是否d形边?br />void setItemMargin(double percent)每个BAR之间的间?br />void setMaxBarWidth(double percent)每个BAR的最大宽?br />void setMinimumBarLength(double min)最短的BAR长度Q避免数值太而显CZ?br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)无法在BAR中显C的正数标签位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position)无法在BAR中显C的负数标签位置

BarRenderer3D(BarRenderer)c:
void setWallPaint(Paint paint)3D坐标轴的墙体颜色

StackedBarRenderer(BarRenderer)c:
没有Ҏ的设|?br />
StackedBarRenderer3D(BarRenderer3D)c:
没有Ҏ的设|?br />
GroupedStackedBarRenderer(StackedBarRenderer)c:
void setSeriesToGroupMap(KeyToGroupMap map)分c自q映射成若q个l(KeyToGroupMap.mapKeyToGroup(series,group)Q?br />
LayeredBarRenderer(BarRenderer)c:
void setSeriesBarWidth(int series,double width)讑֮每个分类的宽度(注意讄不要使某分类被覆盖)

WaterfallBarRenderer(BarRenderer)c:
void setFirstBarPaint(Paint paint)W一个柱囄颜色
void setLastBarPaint(Paint paint)最后一个柱囄颜色
void setPositiveBarPaint(Paint paint)正值柱囄颜色
void setNegativeBarPaint(Paint paint)负值柱囄颜色

IntervalBarRenderer(BarRenderer)c:
需要传IntervalCategoryDataset作ؓ数据?br />
GanttBarRenderer(IntervalBarRenderer)c:
void setCompletePaint(Paint paint)完成q度颜色
void setIncompletePaint(Paint paint)未完成进度颜?br />void setStartPercent(double percent)讄q度条在整条中的起始位置Q?.0?.0Q?br />void setEndPercent(double percent)讄q度条在整条中的l束位置Q?.0?.0Q?br />
StatisticBarRenderer(BarRenderer)c:
需要传StatisticCategoryDataset作ؓ数据?br />
LineAndShapeRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean draw)是否折线的数据点之间用线q?br />void setDrawShapes(boolean draw)是否折线的数据点Ҏ分类使用不同的Ş?br />void setShapesFilled(boolean filled)所有分cL否填充数据点囑Ş
void setSeriesShapesFilled(int series,boolean filled)指定分类是否填充数据点图?br />void setUseFillPaintForShapeOutline(boolean use)指定是否填充数据点的Paint也被用于L据点形状的边?br />
LevelRenderer(AbstractCategoryItemRenderer)c:
void setItemMargin(double percent)每个分类之间的间?br />void setMaxItemWidth(double percent)每个分类的最大宽?br />
CategoryStepRenderer(AbstractCategoryItemRenderer)c:
void setStagger(boolean shouldStagger)不同分类的图是否交错

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean drawLines)是否在每个分cȝ间画q接U?br />void setGroupPaint(Paint groupPaint)一l图形连接线的颜?br />void setGroupStroke(Stroke groupStroke)一l图形连接线的笔?br />void setMaxIcon(Icon maxIcon)最大值的ICON
void setMinIcon(Icon minIcon)最值的ICON
void setObjectIcon(Icon objectIcon)所有值的ICON

AreaRender(AbstractCategoryItemRenderer)c:
没有Ҏ的设|?br />
StackedAreaRender(AreaRender)c:
没有Ҏ的设|?br />

关键是用好Rendererq个cMQ再贴个例子Q?br />    String sFont = "宋体";
    chart.setBorderVisible(true);
    chart.setBorderPaint(new Color(0xFF,0x66,0x00));
    chart.setBackgroundPaint(new Color(0xFF,0xF3,0xDE));
    chart.getTitle().setPaint(Color.red);
    chart.getTitle().setFont(new Font(sFont,Font.BOLD,14));

    //讄PlotQ不昄所有网?br />    ((CategoryPlot)chart.getPlot()).setOutlinePaint(null);
    ((CategoryPlot)chart.getPlot()).setDomainGridlinesVisible(false);
    ((CategoryPlot)chart.getPlot()).setRangeGridlinesVisible(false);

    //讄横u字体Q设定横轴uU不可见Q隐藏纵?br />    ((CategoryPlot)chart.getPlot()).getDomainAxis().setTickLabelFont(new Font(sFont,Font.PLAIN,12));
    ((CategoryPlot)chart.getPlot()).getDomainAxis().setAxisLineVisible(false);
    ((CategoryPlot)chart.getPlot()).getRangeAxis().setVisible(false);

    //采用BarRenderer作ؓ表示?br />    BarRenderer renderer = new BarRenderer();
    renderer.setPaint(new GradientPaint(0.0f,0.0f,Color.orange,0.0f,0.0f,Color.yellow));
    renderer.setOutlinePaint(Color.orange);
    renderer.setDrawBarOutline(true);

    //在条中央昄投票数?br />    renderer.setItemLabelAnchorOffset(-20.0f);
    renderer.setLabelGenerator(new StandardCategoryLabelGenerator("{2}",new DecimalFormat()));
    renderer.setPositiveItemLabelPosition(new ItemLabelPosition());
    renderer.setItemLabelsVisible(true);

]]>
jfreechart1.0技?/title><link>http://www.aygfsteel.com/terrywu/articles/103323.html</link><dc:creator>吴志?/dc:creator><author>吴志?/author><pubDate>Mon, 12 Mar 2007 06:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/terrywu/articles/103323.html</guid><wfw:comment>http://www.aygfsteel.com/terrywu/comments/103323.html</wfw:comment><comments>http://www.aygfsteel.com/terrywu/articles/103323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/terrywu/comments/commentRss/103323.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/terrywu/services/trackbacks/103323.html</trackback:ping><description><![CDATA[ <br />jfreechart目前最高版本ؓ1.0.0?<a target="_blank">http://www.jfree.org/jfreechart/index.html</a>)。可以绘?br />pie charts  饼图,bar charts q?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核心cd介绍Q?br />jfreechart主要׃个大的包l成Qorg.jfree.chart,org.jfree.data。其中前者主要与囑Ş<br />本n有关Q后者与囑Ş昄的数据有兟?br />核心cM要有Q?br />org.jfree.chart.JFreeChartQ图表对象,Mcd的图表的最l表现Ş式都是在该对象进行一些属性的定制。JFreeChart引擎本n提供了一个工厂类用于创徏不同cd的图表对?br />org.jfree.data.category.XXXDataSet:数据集对象,用于提供昄图表所用的数据。根据不同类型的图表对应着很多cd的数据集对象c?br />org.jfree.chart.plot.XXXPlotQ图表区域对象,基本上这个对象决定着什么样式的图表Q创对象的时候需要Axis、Renderer以及数据集对象的支持<br />org.jfree.chart.axis.XXXAxisQ用于处理图表的两个_Uu和横?br />org.jfree.chart.render.XXXRenderQ负责如何显CZ个图表对?br />org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接<br />XXXXXToolTipGenerator:用于生成图象的帮助提C,不同cd图表对应不同cd的工hC类<br />对于常用的饼Nq图,比较单而且|上有很多的文章介绍Q在q里׃再一一复述了,<br />(可以参考这文?a target="_blank">http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc</a>&me=ccidQ?br />主要说明下另一U常见的报表Q时序图Q首先声明一个曲U数据集合对象和曲线对象<br /><br />TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();<br />//声明具体是曲U对象,(可根据实际情况在同一张图中显C多条曲U进行数据比对,Ҏ实际应用情况当超q?条曲U时Q就会有些ؕ?<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))Q只能生成最单位ؓ天的横u所以改用了TimePeriodValuesCollection <br />//Ҏ当前旉取得横u坐标Q时间间隔ؓ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 />//q里改ؓҎ自己E序得到的需要显C的旉点和对应的数据的集合;<br />List objectList1 = dao.getList1();<br />List objectList2 = dao.getList2();<br />//使用循环Q把x_y轴的Dltimeseries1<br />for (int i =0;i<objecthash1.size();i++) {<br />    int hour = objecthash1[i].getHours();<br />    int count = objecthash1[i].getCount();<br /> //每一Ҏ据(旉Q数|d到数据集?(曲线对象1)?br />    timeseries1.add(new Hour(hour, day, month, year),count);<br />}<br />for (int i =0;i<objecthash2.size();i++) {<br />    int hour = objecthash2[i].getHours();<br />    int count = objecthash2[i].getCount();<br /> //每一Ҏ据(旉Q数|d到数据集?(曲线对象2)?br />    timeseries2.add(new Hour(hour, day, month, year),count);<br />}<br />//曲U对象添加到曲线数据集合对象?br />timeseriescollection.addSeries(timeseries1);<br />timeseriescollection.addSeries(timeseries2);<br />//l制报表<br />String title = "日在U用L?; //报表标题<br />String domain = "旉";    //x?br />String range = "用户在线数量";   //y?br />//创徏旉序列囑֯?br />JFreeChart chart = ChartFactory.createTimeSeriesChart(<br />title,  //报表标题<br />domain, //报表横u标签<br />range,  //报表Uu标签<br />timeseriescollection, //数据集合<br />true,  //是否昄图例,在这里如果ؓtrue则会在图表的下方昄各条数据曲线的名U和颜色<br />false, // 是否生成工具<br />false   // 是否生成URL链接);<br />//报表保存ؓjpg文g<br />ChartUtilities.saveChartAsJPEG(file, //文g保存物理路径包括路径和文件名<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="月在U用L?;  //标题<br />String domain="旉(?";//x?br />String range="用户在线数量";//y轾b?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 />当我们生成了一个报表对象时Q可能需要根据实际情冉|军_报表的横轴和Uu的数值间隔,昄方式{?br />可以用XYPlot xyplot = (XYPlot)chart.getPlot();来得到所有数据点的集合。(其它形状图表得到的数据集对象Ҏ实际情况造型Q?br />得到数据炚w合后Q我们就可以讄各条曲线的颜Ԍ和坐标u的距,x轴、y轴的昄方式{等属?br />xyplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //讑֮坐标轴与图表数据昄部分距离<br />xyplot.setDomainGridlinePaint(Color.white); //|格U纵向颜?br />xyplot.setRangeGridlinePaint(Color.white); //|格U横向颜?br />数据点的调整<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />xylineandshaperenderer.setDefaultShapesVisible(true);  //数据点可?br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //讄W一条曲U数据点填充为红Ԍ如果一个图表有多条曲线可分别设|?br />xylineandshaperenderer.setUseFillPaint(true);    //应用<br /><br />使用xyplot.getRangeAxis()得到UuQxyplot.getDomainAxis()得到横uQ得到后可以Ҏ实际情况造型己所需要的cd?br />我的图表Uu为数值类型,横u为时间类型,使用如下方式<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轴显C方?br />dateaxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动定<br />dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x轴单位间隔ؓ1?br />我们q可以是数据格式化以后昄Q比如y轴显C百分比Q?0%?00%Q?x轴显CZؓ×月×日<br />NumberFormat nf =NumberFormat.getPercentInstance();<br />numAxis.setNumberFormatOverride(nf);//讄y轴以癑ֈ比方式显C?br />SimpleDateFormat format = new SimpleDateFormat("MM月dd");<br />dateaxis.setDateFormatOverride(format);//讄x轴数据单位以×月×日方式昄<br />时序图中q有一个很重要的方?br />timeseriescollection.setDomainIsPointsInTime(true); //x轴上的刻度点代表的是旉点而不是时间段<br />最开始我没有讄q个属?l果d来的图,老是差半g能在q个d的时候准显C,往后移了半|是因ؓJFreeChart默认q个d?br />一个时间段Q它把这个刻度和下个d的中间点认ؓ是显C数据点最佳位|?br /><br />其他一些关于AXIScȝҎQ?br />Axisc:<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)Q用于复合表中对多坐标u的设|)<br />void setLabel(String label)坐标轴标?br />void setLabelFont(Font font)坐标轴标题字?br />void setLabelPaint(Paint paint)坐标轴标题颜?br />void setLabelAngle(double angle)`坐标轴标题旋转角度(U坐标可以旋转)<br />void setTickLabelFont(Font font)坐标轴标值字?br />void setTickLabelPaint(Paint paint)坐标轴标值颜?br />void setTickLabelsVisible(boolean flag)坐标轴标值是否显C?br />void setTickMarkPaint(Paint paint)坐标轴标颜?br />void setTickMarkStroke(Stroke stroke)坐标轴标笔?br />void setTickMarksVisible(boolean flag)坐标轴标是否显C?br />ValueAxis(Axis)c:<br />void setAutoRange(boolean auto)自动讄数据轴数据范?br />void setAutoRangeMinimumSize(double size)自动讄数据轴数据范围时数据范围的最跨?br />void setAutoTickUnitSelection(boolean flag)数据轴的数据标签是否自动定Q默认ؓtrueQ?br />void setFixedAutoRange(double length)数据轴固定数据范_讄100的话是昄MAXVALUE到MAXVALUE-100那段数据范围Q?br />void setInverted(boolean flag)数据轴是否反向(默认为falseQ?br />void setLowerMargin(double margin)数据轴下Q左Q边?br />void setUpperMargin(double margin)数据轴上Q右Q边?br />void setLowerBound(double min)数据轴上的显C最?br />void setUpperBound(double max)数据轴上的显C最大?br />void setPositiveArrowVisible(boolean visible)是否昄正向头Q?D轴无效)<br />void setNegativeArrowVisible(boolean visible)是否昄反向头Q?D轴无效)<br />void setVerticalTickLabels(boolean flag)数据轴数据标{是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source)数据轴的数据标签Q可以只昄整数标签Q需要将AutoTickUnitSelection设falseQ?br />NumberAxis(ValueAxis)c:<br />void setAutoRangeIncludesZero(boolean flag)是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)是否强制在整个数据u中包?Q即?不在数据范围?br />void setNumberFormatOverride(NumberFormat formatter)数据轴数据标{昄格式<br />void setTickUnit(NumberTickUnit unit)数据轴的数据标签Q需要将AutoTickUnitSelection设falseQ?br />DateAxis(ValueAxis)c:<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)日期轴的日期标签Q需要将AutoTickUnitSelection设falseQ?br />void setTickMarkPosition(DateTickMarkPosition position)日期标签位置Q参数常量在org.jfree.chart.axis.DateTickMarkPositioncM定义Q?br />CategoryAxis(Axis)c:<br />void setCategoryMargin(double margin)分类轴边?br />void setLowerMargin(double margin)分类轴下Q左Q边?br />void setUpperMargin(double margin)分类轴上Q右Q边?br />void setVerticalCategoryLabels(boolean flag)分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)分类轴分cL{最大宽?img src ="http://www.aygfsteel.com/terrywu/aggbug/103323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/terrywu/" target="_blank">吴志?/a> 2007-03-12 14:47 <a href="http://www.aygfsteel.com/terrywu/articles/103323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChart APIhttp://www.aygfsteel.com/terrywu/articles/49471.html吴志?/dc:creator>吴志?/author>Thu, 01 Jun 2006 02:48:00 GMThttp://www.aygfsteel.com/terrywu/articles/49471.htmlhttp://www.aygfsteel.com/terrywu/comments/49471.htmlhttp://www.aygfsteel.com/terrywu/articles/49471.html#Feedback0http://www.aygfsteel.com/terrywu/comments/commentRss/49471.htmlhttp://www.aygfsteel.com/terrywu/services/trackbacks/49471.htmlJFreeChartc:
void setAntiAlias(boolean flag)    字体模糊边界
void setBackgroundImage(Image image)   背景囄
void setBackgroundImageAlignment(int alignment)  背景囄寚w方式Q参数常量在org.jfree.ui.AligncM定义Q?br />void setBackgroundImageAlpha(float alpha)  背景囄透明度(0.0?.0Q?br />void setBackgroundPaint(Paint paint)   背景?br />void setBorderPaint(Paint paint)   边界U条颜色
void setBorderStroke(Stroke stroke)   边界U条W触
void setBorderVisible(boolean visible)   边界U条是否可见

-----------------------------------------------------------------------------------------------------------

TextTitlec:
void setFont(Font font)     标题字体
void setPaint(Paint paint)    标题字体颜色
void setText(String text)    标题内容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)c:
void setBackgroundPaint(Paint paint)   囄背景?br />void setTitle(String title)    囄标题内容
void setTitleFont(Font font)    囄标题字体
void setBoundingBoxArcWidth(int arcWidth)  囄边界圆角?br />void setBoundingBoxArcHeight(int arcHeight)  囄边界圆角?br />void setOutlinePaint(Paint paint)   囄边界U条颜色
void setOutlineStroke(Stroke stroke)   囄边界U条W触
void setDisplaySeriesLines(boolean flag)  囄Ҏ否显C横U(折线图有效)
void setDisplaySeriesShapes(boolean flag)  囄Ҏ否显CŞӞ折线图有效)
void setItemFont(Font font)    囄字?br />void setItemPaint(Paint paint)    囄字体颜?br />void setAnchor(int anchor)    囄在图表中的显CZ|(参数帔R在LegendcM定义Q?

-----------------------------------------------------------------------------------------------------------

Axisc:
void setVisible(boolean flag)    坐标轴是否可?br />void setAxisLinePaint(Paint paint)   坐标轴线条颜Ԍ3D轴无效)
void setAxisLineStroke(Stroke stroke)   坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible)  坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension)  Q用于复合表中对多坐标u的设|)
void setLabel(String label)    坐标轴标?br />void setLabelFont(Font font)    坐标轴标题字?br />void setLabelPaint(Paint paint)    坐标轴标题颜?br />void setLabelAngle(double angle)`   坐标轴标题旋转角度(U坐标可以旋转)
void setTickLabelFont(Font font)   坐标轴标值字?br />void setTickLabelPaint(Paint paint)   坐标轴标值颜?br />void setTickLabelsVisible(boolean flag)   坐标轴标值是否显C?br />void setTickMarkPaint(Paint paint)   坐标轴标颜?br />void setTickMarkStroke(Stroke stroke)   坐标轴标笔?br />void setTickMarksVisible(boolean flag)   坐标轴标是否显C?

ValueAxis(Axis)c:
void setAutoRange(boolean auto)    自动讄数据轴数据范?br />void setAutoRangeMinimumSize(double size)  自动讄数据轴数据范围时数据范围的最跨?br />void setAutoTickUnitSelection(boolean flag)  数据轴的数据标签是否自动定Q默认ؓtrueQ?br />void setFixedAutoRange(double length)   数据轴固定数据范_讄100的话是昄MAXVALUE到MAXVALUE-100那段数据范围Q?br />void setInverted(boolean flag)    数据轴是否反向(默认为falseQ?br />void setLowerMargin(double margin)   数据轴下Q左Q边?br />void setUpperMargin(double margin)   数据轴上Q右Q边?br />void setLowerBound(double min)    数据轴上的显C最?br />void setUpperBound(double max)    数据轴上的显C最大?br />void setPositiveArrowVisible(boolean visible)  是否昄正向头Q?D轴无效)
void setNegativeArrowVisible(boolean visible)  是否昄反向头Q?D轴无效)
void setVerticalTickLabels(boolean flag)  数据轴数据标{是否旋转到垂直
void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签Q可以只昄整数标签Q需要将AutoTickUnitSelection设falseQ?

NumberAxis(ValueAxis)c:
void setAutoRangeIncludesZero(boolean flag)  是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag)  是否强制在整个数据u中包?Q即?不在数据范围?br />void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标{昄格式
void setTickUnit(NumberTickUnit unit)   数据轴的数据标签Q需要将AutoTickUnitSelection设falseQ?

DateAxis(ValueAxis)c:
void setMaximumDate(Date maximumDate)   日期轴上的最日?br />void setMinimumDate(Date minimumDate)   日期轴上的最大日?br />void setRange(Date lower,Date upper)   日期轴范?br />void setDateFormatOverride(DateFormat formatter) 日期轴日期标{昄格式
void setTickUnit(DateTickUnit unit)   日期轴的日期标签Q需要将AutoTickUnitSelection设falseQ?br />void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置Q参数常量在org.jfree.chart.axis.DateTickMarkPositioncM定义Q?

CategoryAxis(Axis)c:
void setCategoryMargin(double margin)   分类轴边?br />void setLowerMargin(double margin)   分类轴下Q左Q边?br />void setUpperMargin(double margin)   分类轴上Q右Q边?br />void setVerticalCategoryLabels(boolean flag)  分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio)  分类轴分cL{最大宽?

-----------------------------------------------------------------------------------------------------------

Plotc:
void setBackgroundImage(Image image)   数据区的背景囄
void setBackgroundImageAlignment(int alignment)  数据区的背景囄寚w方式Q参数常量在org.jfree.ui.AligncM定义Q?br />void setBackgroundPaint(Paint paint)   数据区的背景囄背景?br />void setBackgroundAlpha(float alpha)   数据区的背景透明度(0.0?.0Q?br />void setForegroundAlpha(float alpha)   数据区的前景透明度(0.0?.0Q?br />void setDataAreaRatio(double ratio)   数据区占整个图表区的癑ֈ?br />void setOutLinePaint(Paint paint)   数据区的边界U条颜色
void setOutLineStroke(Stroke stroke)   数据区的边界U条W触
void setNoDataMessage(String message)   没有数据时显C的消息
void setNoDataMessageFont(Font font)   没有数据时显C的消息字体
void setNoDataMessagePaint(Paint paint)   没有数据时显C的消息颜色

CategoryPlot(Plot)c:
void setDataset(CategoryDataset dataset)  数据区的2l数据表
void setColumnRenderingOrder(SortOrder order)  数据分类的排序方?br />void setAxisOffset(Spacer offset)   坐标轴到数据区的间距
void setOrientation(PlotOrientation orientation) 数据区的方向QPlotOrientation.HORIZONTAL或PlotOrientation.VERTICALQ?br />void setDomainAxis(CategoryAxis axis)   数据区的分类?br />void setDomainAxisLocation(AxisLocation location) 分类轴的位置Q参数常量在org.jfree.chart.axis.AxisLocationcM定义Q?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) 数据轴的位置Q参数常量在org.jfree.chart.axis.AxisLocationcM定义Q?br />void setRangeGridlinesVisible(boolean visible)  数据轴网格是否可?br />void setRangeGridlinePaint(Paint paint)   数据轴网格线条颜?br />void setRangeGridlineStroke(Stroke stroke)  数据轴网格线条笔?br />void setRenderer(CategoryItemRenderer renderer)  数据区的表示者(详见Rendererl)
void addAnnotation(CategoryAnnotation annotation) l数据区加一个注?br />void addRangeMarker(Marker marker,Layer layer)  l数据区加一个数D围区?

PiePlot(Plot)c:
void setDataset(PieDataset dataset)   数据区的1l数据表
void setIgnoreNullValues(boolean flag)   忽略无值的分类
void setCircular(boolean flag)    饼图是否一定是正圆
void setStartAngle(double angle)   饼图的初始角?br />void setDirection(Rotation direction)   饼图的旋转方?br />void setExplodePercent(int section,double percent) 抽取的那块(1l数据表的分cM标)以及抽取出来的距(0.0?.0Q,3D饼图无效
void setLabelBackgroundPaint(Paint paint)  分类标签的底?br />void setLabelFont(Font font)    分类标签的字?br />void setLabelPaint(Paint paint)    分类标签的字体颜?br />void setLabelLinkMargin(double margin)   分类标签与图的连接线边距
void setLabelLinkPaint(Paint paint)   分类标签与图的连接线颜色
void setLabelLinkStroke(Stroke stroke)   分类标签与图的连接线W触
void setLabelOutlinePaint(Paint paint)   分类标签Ҏ颜色
void setLabelOutlineStroke(Paint paint)   分类标签ҎW触
void setLabelShadowPaint(Paint paint)   分类标签阴媄颜色
void setMaximumLabelWidth(double width)   分类标签的最大长度(0.0?.0Q?br />void setPieIndex(int index)    饼图的烦引(复合饼图中用刎ͼ
void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的Ҏ颜色
void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的ҎW触
void setSectionPaint(int section,Paint paint)  指定分类饼的颜色
void setShadowPaint(Paint paint)   饼图的阴影颜?br />void setShadowXOffset(double offset)   饼图的阴q对图的水q_U?br />void setShadowYOffset(double offset)   饼图的阴q对图的垂直偏U?br />void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,讄成null则整个标{֌括连接线都不昄
void setToolTipGenerator(PieToolTipGenerator generator)  MAP中鼠标移上的昄格式
void setURLGenerator(PieURLGenerator generator)   MAP中钻取链接格?

PiePlot3D(PiePlot)c:
void setDepthFactor(double factor)   3D饼图的Z轴高度(0.0?.0Q?

MultiplePiePlot(Plot)c:
void setLimit(double limit)    每个饼图之间的数据关联(详细比较复杂Q  ?br />void setPieChart(JFreeChart pieChart)   每个饼图的显C方式(见JFreeChartcMPiePlotc)

-----------------------------------------------------------------------------------------------------------

AbstractRendererc:
void setItemLabelAnchorOffset(double offset)     数据标签的与数据点的偏移
void setItemLabelsVisible(boolean visible)     数据标签是否可见
void setItemLabelFont(Font font)      数据标签的字?br />void setItemLabelPaint(Paint paint)      数据标签的字体颜?br />void setItemLabelPosition(ItemLabelPosition position)    数据标签位置
void setPositiveItemLabelPosition(ItemLabelPosition position)   正数标签位置
void setNegativeItemLabelPosition(ItemLabelPosition position)   负数标签位置
void setOutLinePaint(Paint paint)      囑ŞҎ的线条颜?br />void setOutLineStroke(Stroke stroke)      囑ŞҎ的线条笔?br />void setPaint(Paint paint)       所有分cd形的颜色
void setShape(Shape shape)       所有分cd形的形状Q如折线囄点)
void setStroke(Stroke stroke)       所有分cd形的W触Q如折线囄U)
void setSeriesItemLabelsVisible(int series,boolean visible)   指定分类的数据标{是否可?br />void setSeriesItemLabelFont(int series,Font font)    指定分类的数据标{字体
void setSeriesItemLabelPaint(int series,Paint paint)    指定分类的数据标{字体颜色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position)  数据标签位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置
void setSeriesOutLinePaint(int series,Paint paint)    指定分类的图形边框的U条颜色
void setSeriesOutLineStroke(int series,Stroke stroke)    指定分类的图形边框的U条W触
void setSeriesPaint(int series,Paint paint)     指定分类囑Ş的颜?br />void setSeriesShape(int series,Shape shape)     指定分类囑Ş的ŞӞ如折U图的点Q?br />void setSeriesStroke(int series,Stroke stroke)     指定分类囑Ş的笔触(如折U图的线Q?

AbstractCategoryItemRenderer(AbstractRenderer)c:
void setLabelGenerator(CategoryLabelGenerator generator)   数据标签的格?br />void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠标移上的昄格式
void setItemURLGenerator(CategoryURLGenerator generator)   MAP中钻取链接格?br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标{格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的昄格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格?

BarRenderer(AbstractCategoryItemRenderer)c:
void setDrawBarOutline(boolean draw)      是否d形边?br />void setItemMargin(double percent)      每个BAR之间的间?br />void setMaxBarWidth(double percent)      每个BAR的最大宽?br />void setMinimumBarLength(double min)      最短的BAR长度Q避免数值太而显CZ?br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显C的正数标签位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显C的负数标签位置

BarRenderer3D(BarRenderer)c:
void setWallPaint(Paint paint)    3D坐标轴的墙体颜色

StackedBarRenderer(BarRenderer)c:
没有Ҏ的设|?

StackedBarRenderer3D(BarRenderer3D)c:
没有Ҏ的设|?

GroupedStackedBarRenderer(StackedBarRenderer)c:
void setSeriesToGroupMap(KeyToGroupMap map)  分c自q映射成若q个l(KeyToGroupMap.mapKeyToGroup(series,group)Q?

LayeredBarRenderer(BarRenderer)c:
void setSeriesBarWidth(int series,double width)  讑֮每个分类的宽度(注意讄不要使某分类被覆盖)

WaterfallBarRenderer(BarRenderer)c:
void setFirstBarPaint(Paint paint)   W一个柱囄颜色
void setLastBarPaint(Paint paint)   最后一个柱囄颜色
void setPositiveBarPaint(Paint paint)   正值柱囄颜色
void setNegativeBarPaint(Paint paint)   负值柱囄颜色

IntervalBarRenderer(BarRenderer)c:
需要传IntervalCategoryDataset作ؓ数据?

GanttBarRenderer(IntervalBarRenderer)c:
void setCompletePaint(Paint paint)   完成q度颜色
void setIncompletePaint(Paint paint)   未完成进度颜?br />void setStartPercent(double percent)   讄q度条在整条中的起始位置Q?.0?.0Q?br />void setEndPercent(double percent)   讄q度条在整条中的l束位置Q?.0?.0Q?

StatisticBarRenderer(BarRenderer)c:
需要传StatisticCategoryDataset作ؓ数据?

LineAndShapeRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean draw)    是否折线的数据点之间用线q?br />void setDrawShapes(boolean draw)   是否折线的数据点Ҏ分类使用不同的Ş?br />void setShapesFilled(boolean filled)   所有分cL否填充数据点囑Ş
void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图?br />void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于L据点形状的边?

LevelRenderer(AbstractCategoryItemRenderer)c:
void setItemMargin(double percent)   每个分类之间的间?br />void setMaxItemWidth(double percent)   每个分类的最大宽?

CategoryStepRenderer(AbstractCategoryItemRenderer)c:
void setStagger(boolean shouldStagger)   不同分类的图是否交错

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean drawLines)   是否在每个分cȝ间画q接U?br />void setGroupPaint(Paint groupPaint)   一l图形连接线的颜?br />void setGroupStroke(Stroke groupStroke)   一l图形连接线的笔?br />void setMaxIcon(Icon maxIcon)    最大值的ICON
void setMinIcon(Icon minIcon)    最值的ICON
void setObjectIcon(Icon objectIcon)   所有值的ICON

AreaRender(AbstractCategoryItemRenderer)c:
没有Ҏ的设|?

StackedAreaRender(AreaRender)c:
没有Ҏ的设|?/p>



]]>
JasperReportl验?http://www.aygfsteel.com/terrywu/articles/49461.html吴志?/dc:creator>吴志?/author>Thu, 01 Jun 2006 02:36:00 GMThttp://www.aygfsteel.com/terrywu/articles/49461.htmlhttp://www.aygfsteel.com/terrywu/comments/49461.htmlhttp://www.aygfsteel.com/terrywu/articles/49461.html#Feedback0http://www.aygfsteel.com/terrywu/comments/commentRss/49461.htmlhttp://www.aygfsteel.com/terrywu/services/trackbacks/49461.html JasperReport和iReport是不错的Java报表工具. 在实际项目中, 本h用它们开发了20个Report, 涉及SubReport, Image, Graph, U篏了一些经? 其是关于Export到Excel斚w, 文上也很少提及, Ua是摸索出来的, 有的问题q是通过L代码才解决的. 此脓q入门教程, 差不多算是笔记吧, 以问{Ş式记? 

 

     

  1. iReport

     

  2. 安装

     

       

    1. 下蝲Q解压iReport 0.4.0 (推荐src版本Q?

       

    2. 认JDK?.4以上

       

    3. 把JDK /lib下的tools.jar拯到{ireport_home}/lib目录?

     

  3. q行

     

       

    1. 对于下蝲的Binary版本Q只能运?bin/startup.bat

       

    2. 对于下蝲的Src版本Q可以通过ant iReportq行Q先安装ant)

       

    3. 如果q行startup.batQ出现java.lang.NoSuchMethodError错误Q一般是JDK版本太低。如果确认已安装?.4或以上,查pathpȝ变量Q看看有1.3的JRE是不是排在前面(比如安装了Oracle的客LQ往往?.3的JREQ,如果出现Class Not FoundQ检查classpath。对于通过ant的方式运行,一般都没什么问题,所以推荐下载src版本

     

  4. JasperReport 常见问题

     

       

    1. .jrxml vs .jasper

       

         

      • 如果在运行时载入.jrxml, 那么每次调用q得~译, 不如预先~译?jasper.不过预先~译的jasper,必须用同L本的JasperReport载入,而且灉|性差? 不过对于大部分报?q是预先~译成jasper方便

       

    2. 如果扚w~译jrxml

       

         

      • 用Ant很容易解?br />
         

        .....

         

       

    3. 如何使用囄Q?

       

         

      • 很容?用Image控g可以了. 在Image Express里面可以用String来表C图片的路径, 或者用InputStream, File对象.不过不管用Fileq是String对象, 都不得不用绝对\? q显然很不灵z? 解决办法?I入一?P的参?表示囄所在的目录,然后?P和文件名拼接出完整的l对路径. 更好的方法是用InputStream, 例如this.getClass().getResourceAsStream("logo.jpg") ,q时只要把图片放在当?jasper所在的目录可以了,不必考虑什么参?什么\径了

       

    4. 昄非数据库字段变量

       

         

      • 昄如运行日期等,可以直接在Text Field里面输入new java.util.Date(), 然后把Pattern设成如mm/dd/yyyy.

       

    5. 动态控制某些Field是否昄

       

         

      • 每个Static Text, Text Field甚至整个Band的属性里面都有Print When Expression, 比如设成new Boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么只有当参数display的gؓyes的时候才昄

       

    6. 使用Sub Report, 如何使用相对路径

       

         

      • ?.3, 和用图片类? 用InputStream或者传入参?

       

    7. Query里面如何使用参数

       

         

      • $P!{xxx} 或?$P{xxx} 后者只能用于类似PreparedStatement参数l定, 而前者可替换Sql的Q意部? 在需要动态排序的时? 前者特别有? 比如 select a,b,c from t order by $P!{orderClause}   不管?Pq是$P!, SQL最l是以PreparedStatement方式执行? 不必太担心性能问题   注意:参数是不能嵌套的, 比如$P{a} =''$P''   , $P=''value'', 不要指望$P{a}能被替换?'value''

       

    8. 如何使用图表(Graph)

       

         

      • JasperReport本n没有图表功能, 只有昄Image的功??.3). iReport里有个Graph向导, 其实质是通过jFreeChart生成Image. 更另? 更直接的做法是放一个Image控g, Image Express Class讄成java.awt.Image, 在Image Expression里通过自定义的c返回java.awt.Image对象. 例如''GraphProvider.getImage($P{REPORT_DATASOURCE},title, subtitle.....)''.  GraphProvider是自qc? public static Image getImage(JRDataSource, ....)

       

    9. 如果昄多个图表

       

         

      • 在一张报表上昄一个图表和昄多个图表是不同的. 假设Query是select name,price,qty from xxx, W一张图昄name-price, W二张图昄name-qty, 如果q是?.8的方? W二张图Ҏ昄不出? Z么?因ؓ传入的是JRDataSource, 而JRDataSource仅仅是对ResultSet的简单封? 在第一张图处理完后, 游标已经Ceof位置? 在开始处理第二张囄时?必然抛出游标耗尽的异? 怎么办 ?自己写个JRDataSourceAdapter, 把JRDataSource对象里面的值预先保存到一个Collection (相当于一个Offline的数据集), 然后把这个Collection传个getImageҎ. 具体? Z个Variable  mydate, cd是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Ҏ

     

  5. Export到Excel的问?

     

       

    1. 如何L报表头等

       

         

      • 直接把不需要的Band删除(把其高度设ؓ0). 如果仅仅是export到Excel的时候不需要报表头, 而输出到PDF{仍焉要保? 那么使用print when expression, ?.4

       

    2. 如果让Excel看v来整?

       

         

      • 不要有空白地? 首先把所有的Field设成一样高, 寚w! 把所在Band的高度也设成和Field一样高, 让Field正好攑օBand. 然后调整Field的宽? 让每个Field都相?没有I隙. 最?记得讄参数: exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
                            Boolean.TRUE);

       

    3. 如何保留GridLine

       

         

      • 首先, 讄参数exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 然后,把每个Field或者Static Text框的''Transparent''属性都勾上

       

    4. 如何使字D名只显CZ?

       

         

      • 如果把字D名攑֜ColumnHead区域, 那么输出到Excel, 会每个Page都显CZ? 在设计Report时? 一般会讑֮Page大小. 然而对于Excel, q个Page讑֮仍然存在,而且往往很讨? 因ؓ在Excel? 通常希望得到q箋的数? 然而Jasper仍然?'自作多情''q行分页. 比如? 设计JasperReport的时? 讑֮page size为Letter, Portrait, 那么输出到Excel的时候每隔大U?0?具体取决于Field的高?, page header, column header, column foot, page foot 会被重复一? 而且q附带一个高度ؓ0的Excel Row, 表示Page Break的地? 把字D名攑֜title band? 可以解决字段名重复的问题, 当然page header也不要显CZ. 如果需? 可以把title band的print when expression设成只有输出Excel的时候才昄

       

    5. Z么Excel里面的数据是从第二行,WB列开始显C的 

       

         

      • 因ؓW一行和WA列分别是用来表示page top margin ?page left margin? 对于Excel来说, Ua多余. 解决Ҏ是把page margin 设成0. 不过如果q个reportq需要以PDF{显C? 那么设成0׃好看? 最好能动态的改变page margin. 当然,q个改变只能在外?调用Report的地? q行, 在设计Report的时候是无能为力? 不幸的是, JasperReportcd然没有setMargin的方?只有getter. 折中的方法只能是reflect? 代码C意如下: //use reflect to set the private field of JRBaseReport
                         java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(
                                "leftMargin");
                        margin.setAccessible(true);
                        margin.setInt(myRpt, 0);                 margin = JRBaseReport.class.getDeclaredField("topMargin");
                        margin.setAccessible(true);
                        margin.setInt(myRpt, 0);                 margin = JRBaseReport.class.getDeclaredField("bottomMargin");
                        margin.setAccessible(true);
                        margin.setInt(myRpt, 0);

       

    6. 如何LExcel中隐藏的行?

       

         

      • 如前说述, ׃page break的关p? Excel中每隔几十行,有一个高度ؓ0的row, 即把page botom margin设ؓ0, 把page footerL都没有办? 唯一的解军_法是把page height设ؓ很大. ?.5一? 不得不用reflect:

         

           

        • java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField(
                                  "pageHeight");
                          pageHeight.setAccessible(true);
                          pageHeight.setInt(myRpt, Integer.MAX_VALUE);

     

  6. 文

     

       

    1. 哪里有文档?

       

         

      • JasperReport有䆾Ultimate Guide, 不过不是免费? 和jFreeChart一个d? 不过|上有流? 写的q可? 60多页, 不过也没详细到哪里去. 如果下蝲源代码版, 那么看看自带的Demo也不? SF的论坛也是问问题的最好地?

     

  7. 源代?仅供参?reportProvider--一个Servlet, GraphProider, JRDataAdapter都是普通类)

 

/**
 *

 

Title: ReportProviderServlet


 *

 

Description: Servlet to generate Jasper reports


 *

 

Copyright: Copyright (c) 2004


 *

 

Company: *****


 * @author zephyr
 * @version 1.0
 */
package xyz;

 

 

 

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.base.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.util.*;

 

import org.apache.log4j.*;

 

import java.io.*;

 

import java.sql.*;

 

import java.util.*;

 

import javax.servlet.*;
import javax.servlet.http.*;

 


public class ReportProviderServlet extends HttpServlet
{
    private static Logger log = LogManager.getLogger(ReportProviderServlet.class);

 

    //Initialize: Setup DataSourceManager
    public void init() throws javax.servlet.ServletException
    {
        String prefix = getServletContext().getRealPath("/");
        String file = getInitParameter("data-source-file");

 

        DataSourceManager.configure(prefix + file);

 

        log.info("initialized successfully!");
    }

 

    //Process the HTTP request
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        String reportClass = request.getParameter("reportClass");

 

        log.debug("Running Report:" + reportClass);

 

        boolean isExcelFormat = false;

 

        if (reportClass == null)
        {
            throw new IllegalArgumentException("Jasper Class Unspecified");
        }

 

        String reportFormat = request.getParameter("reportFormat");

 

        if (reportFormat == null)
        {
            reportFormat = "jasperPrint";
        }

 

        try
        {
            JasperReport myRpt = JasperManager.loadReport(this.getClass()
                                                              .getResourceAsStream("/jasperReports/" +
                        reportClass + ".jasper"));

 

            //set ReprintHeaderOnEachPage=false for Excel Format
            isExcelFormat = reportFormat.equalsIgnoreCase("excel");

 

            if (isExcelFormat)
            {
                //use reflect to set the private field of JRBaseReport
                //No margin for excel format, max pageHeight
                java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(
                        "leftMargin");
                margin.setAccessible(true);
                margin.setInt(myRpt, 0);

 

                margin = JRBaseReport.class.getDeclaredField("topMargin");
                margin.setAccessible(true);
                margin.setInt(myRpt, 0);

 

                margin = JRBaseReport.class.getDeclaredField("bottomMargin");
                margin.setAccessible(true);
                margin.setInt(myRpt, 0);

 

                java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField(
                        "pageHeight");
                pageHeight.setAccessible(true);
                pageHeight.setInt(myRpt, Integer.MAX_VALUE);

 

                //Don't print group header on each page
                if (null != myRpt.getGroups())
                {
                    for (int i = 0; i < myRpt.getGroups().length; i++)
                    {
                        myRpt.getGroups()[i].setReprintHeaderOnEachPage(false);
                    }
                }
            }

 

            Map params = new HashMap(10);
            Enumeration enu = request.getParameterNames();

 

            while (enu.hasMoreElements())
            {
                String key = (String) enu.nextElement();
                params.put(key,
                    request.getParameter(key).toUpperCase().replaceAll("'", "''"));
                log.debug(key + "=" + request.getParameter(key));
            }

 

            log.debug("Before Filling");

 

            OutputStream httpOut = response.getOutputStream();

 

            Connection conn = DataSourceManager.getConnection(request.getSession());

 

            JasperPrint rptPnt = JasperManager.fillReport(myRpt, params, conn);

 

            conn.close();

 

            if (reportFormat.equalsIgnoreCase("jasperPrint"))
            {
                response.setContentType("application/octet-stream");
                JRSaver.saveObject(rptPnt, httpOut);
            }
            else if (reportFormat.equalsIgnoreCase("pdf"))
            {
                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition",
                    "attachment;filename=\"" + reportClass + ".PDF\"");
                JasperManager.printReportToPdfStream(rptPnt, httpOut);
            }
            else if (reportFormat.equalsIgnoreCase("excel"))
            {
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-Disposition",
                    "attachment;filename=\"" + reportClass + ".XLS\"");

 

                JRXlsExporter exporter = new JRXlsExporter();

 

                exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);
                exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
                    Boolean.TRUE);
                exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
                    Boolean.FALSE);
                exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
                    Boolean.FALSE);
                exporter.exportReport();
            }
            else if (reportFormat.equalsIgnoreCase("html"))
            {
                JRHtmlExporter exporter = new JRHtmlExporter();
                response.setContentType("text/html");

 

                Map imagesMap = new HashMap();

 

                request.getSession().setAttribute("IMAGES_MAP", imagesMap);

 

                exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,
                    imagesMap);
                exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
                    "image.jsp image=");
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);

 

                exporter.exportReport();
            }

 

            log.debug("Report Exported");
        }
        catch (Exception ex)
        {
            log.error("Error Occured", ex);
        }
    }
}

 

 

 

 

 

/**
 *

 

Title: JRDataSourceAdapter


 *

 

Description: Converting JRDataSource to Mapped ArrayList


 *

 

Copyright: Copyright (c) 2004


 *

 

Company: *****


 * @author zephyr
 * @version 1.0
 */
package xyz;

 

 

 

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.*;

 

import java.util.*;

 


public class JRDataSourceAdapter
{
    public static Map JRDataSource2Map(JRDataSource dataSource, String[] fieldNames,
        Class[] fieldClasses) throws JRException
    {
        HashMap result;

 

        if (fieldNames.length != fieldClasses.length)
        {
            throw new JRException("Number of Field Name & Class unmatch");
        }

 

        JRDesignField[] fields = new JRDesignField[fieldNames.length];

 

        result = new HashMap(4);

 

        for (int i = 0; i < fieldNames.length; i++)
        {
            fields[i] = new JRDesignField();
            fields[i].setName(fieldNames[i]);
            fields[i].setValueClass(fieldClasses[i]);
            result.put(fieldNames[i], new ArrayList());
        }

 

        do
        {
            for (int i = 0; i < fields.length; i++)
            {
                Object value = dataSource.getFieldValue(fields[i]);
                ((ArrayList) result.get(fields[i].getName())).add(value);
            }
        }
        while (dataSource.next());

 

        return result;
    }
}

 

 

 

/**
 *

 

Title: GraphProvider


 *

 

Description: Generate JFreeChart Image


 *

 

Copyright: Copyright (c) 2004


 *

 

Company: ****


 * @author zephyr 
 * @version 1.0
 */
package xyz;

 

 

 

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.*;
import net.sf.jasperreports.engine.export.*;

 

import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;

 

import org.jfree.data.*;

 

import java.awt.*;
import java.awt.image.*;

 

import java.io.*;

 

import java.util.*;

 


public class GraphProvider
{
    public static Image getImage(Map dataSource, String fieldNameX, String fieldNameY,
        String chartName, String titleX, String titleY, boolean isBarChart, int imageWidth,
        int imageHeight) throws JRException
    {
        JRDesignField fieldX = new JRDesignField();
        fieldX.setName(fieldNameX);
        fieldX.setValueClass(java.lang.String.class);

 

        JRDesignField fieldY = new JRDesignField();
        fieldY.setName(fieldNameY);
        fieldY.setValueClass(java.lang.Double.class);

 

        ArrayList periods = (ArrayList) dataSource.get(fieldNameX);
        ArrayList values = (ArrayList) dataSource.get(fieldNameY);

 

        DefaultCategoryDataset categoryDs = new DefaultCategoryDataset();

 

        for (int i = 0; i < values.size(); i++)
        {
            Object obj = values.get(i);
            double dataValue = 0;

 

            if (obj != null)
            {
                dataValue = ((Double) obj).doubleValue();
            }

 

            categoryDs.addValue(dataValue, null, (String) periods.get(i));
        }

 

        JFreeChart c = null;

 

        if (isBarChart)
        {
            c = ChartFactory.createBarChart(chartName, titleX, titleY, categoryDs,
                    PlotOrientation.VERTICAL, false, false, false);
        }
        else
        {
            c = ChartFactory.createLineChart(chartName, titleX, titleY, categoryDs,
                    PlotOrientation.VERTICAL, false, false, false);
        }

 

        c.getTitle().setFont(new Font("Arial", Font.BOLD, 16));

 

        NumberAxis axis = (NumberAxis) c.getCategoryPlot().getRangeAxis();
        axis.setAutoRange(true);

 

        TickUnitSource tickUnits = NumberAxis.createIntegerTickUnits();
        axis.setStandardTickUnits(tickUnits);

 

        return (c.createBufferedImage(imageWidth, imageHeight));

 

       }
}



]]>
使用JfreeChart开发图表经验ȝ http://www.aygfsteel.com/terrywu/articles/49460.html吴志?/dc:creator>吴志?/author>Thu, 01 Jun 2006 02:34:00 GMThttp://www.aygfsteel.com/terrywu/articles/49460.htmlhttp://www.aygfsteel.com/terrywu/comments/49460.htmlhttp://www.aygfsteel.com/terrywu/articles/49460.html#Feedback0http://www.aygfsteel.com/terrywu/comments/commentRss/49460.htmlhttp://www.aygfsteel.com/terrywu/services/trackbacks/49460.html阅读全文

]]>
JFreeCharthttp://www.aygfsteel.com/terrywu/articles/49430.html吴志?/dc:creator>吴志?/author>Thu, 01 Jun 2006 02:12:00 GMThttp://www.aygfsteel.com/terrywu/articles/49430.htmlhttp://www.aygfsteel.com/terrywu/comments/49430.htmlhttp://www.aygfsteel.com/terrywu/articles/49430.html#Feedback0http://www.aygfsteel.com/terrywu/comments/commentRss/49430.htmlhttp://www.aygfsteel.com/terrywu/services/trackbacks/49430.html
一、jFreeChart产生囑Ş的流E?/span>
创徏一个数据源QdatasetQ来包含要在图形中昄的数?????>>创徏一?JFreeChart 对象来代表要昄的图?
??????>>把图形输?
重要的类和接口:
org.jfree.data.general.Dataset 所有数据源c都要实现的接口
org.jfree.chart.ChartFactory 由它来?JFreeChart 对象
org.jfree.chart.JFreeChart 所有对囑Ş的调整都是通过它噢Q!
org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它,然后再通过它对囑Ş外部部分Q例Q坐标uQ调?
注意Q它有很多子c,一般都下嗍造型到它的子c!
org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它,然后再通过它对囑Ş内部部分
Q例Q折U的cdQ调整。同P针对不同cd的报表图Q它?
着不同的子cd玎ͼ在下面我们简U它?Renderer
下面我们l合不同cd的图形来具体分析q个程?

二、饼?/span>
饼图的dataset 一般是用PieDataset 接口Q具体实现类?DefaultPieDataset
1、创Z个数据源QdatasetQ:
private static PieDataset createDataset()
{
DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDatasetQ!
defaultpiedataset.setValue("One", new Double(43.200000000000003D));
defaultpiedataset.setValue("Two", new Double(10D));
defaultpiedataset.setValue("Three", new Double(27.5D));
defaultpiedataset.setValue("Four", new Double(17.5D));
return defaultpiedataset;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(PieDataset piedataset)
{
JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 1", //囑Ş标题名称
piedataset, // dataset
true, // legend?
true, // tooltips?
false); //URLs?
PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过JFreeChart 对象获得 plotQPiePlotQ!
pieplot.setNoDataMessage("No data available"); // 没有数据的时候显C的内容
return jfreechart;
}
一些重要的ҎQ?
pieplot.setExplodePercent(0,0.3D) //把Lable ?One" 的那一块”挖“出?0%
3、输出略

三、柱状图
q囄dataset 一般是用CatagoryDataset接口(具体实现cLDefaultCategoryDataset),也会?IntervalXYDataset
接口
1、创Z个数据源QdatasetQ:
private static CategoryDataset createDataset()
{
String series1 = "First";
String series2 = "Second";
String series3 = "Third";
String category1 = "Category 1";
String category2 = "Category 2";
String category3 = "Category 3";
String category4 = "Category 4";
String category5 = "Category 5";
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, category1);
defaultcategorydataset.addValue(4D, series1, category2);
defaultcategorydataset.addValue(3D, series1, category3);
defaultcategorydataset.addValue(5D, series1, category4);
defaultcategorydataset.addValue(5D, series1, category5);

defaultcategorydataset.addValue(5D, series2, category1);
defaultcategorydataset.addValue(7D, series2, category2);
defaultcategorydataset.addValue(6D, series2, category3);
defaultcategorydataset.addValue(8D, series2, category4);
defaultcategorydataset.addValue(4D, series2, category5);

defaultcategorydataset.addValue(4D, series3, category1);
defaultcategorydataset.addValue(3D, series3, category2);
defaultcategorydataset.addValue(2D, series3, category3);
defaultcategorydataset.addValue(3D, series3, category4);
defaultcategorydataset.addValue(6D, series3, category5);
return defaultcategorydataset;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo", //囑Ş标题名称
"Category",//domain ?Lable
q里先简单理解ؓ横坐标Lable好了
"Value", //range ?Lable
q里也先单理解ؓU坐标Lable好了
categorydataset, // dataset
PlotOrientation.VERTICAL, //垂直昄
true, // legend?
true, // tooltips?
false); //URLs?
jfreechart.setBackgroundPaint(Color.white); //讑֮背景色ؓ白色
CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //获得 plotQCategoryPlotQ!
categoryplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?
categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色
categoryplot.setDomainGridlinesVisible(true); //可见
categoryplot.setRangeGridlinePaint(Color.white); //U坐标网格线白色
//下面两行使纵坐标的最单位格为整?
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意q里是下嗍造型
到BarRendererQ!
barrenderer.setDrawBarOutline(false); // Bar的外轮廓U不?
GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,
0.0F, 0.0F, new Color(0, 0, 64)); //讑֮特定颜色
GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,
0.0F, 0.0F, new Color(0, 64, 0));
GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,
0.0F, 0.0F, new Color(64, 0, 0));
barrenderer.setSeriesPaint(0, gradientpaint); //lseries1 Bar讑֮上面定义的颜?
barrenderer.setSeriesPaint(1, gradientpaint1); //lseries2 Bar 讑֮上面定义的颜?
barrenderer.setSeriesPaint(2, gradientpaint2); //lseries3 Bar 讑֮上面定义的颜?
CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //横u上的 Lable 45度倾斜
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
return jfreechart;
}
一些重要的ҎQ(增加一块标讎ͼ
IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);
intervalmarker.setLabel("Target Range");
intervalmarker.setLabelFont(new Font("SansSerif", 2, 11));
intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
intervalmarker.setPaint(new Color(222, 222, 255, 128));
categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);

四、折U图
折线囄dataset 两种CatagoryDataset接口(具体实现cLDefaultCategoryDataset),XYDataset 接口
1、CatagoryDataset接口Q?
A、创Z个数据源QdatasetQ:
private static CategoryDataset createDataset()
{
String series1 = "First";
String series2 = "Second";
String series3 = "Third";
String type1 = "Type 1";
String type2 = "Type 2";
String type3 = "Type 3";
String type4 = "Type 4";
String type5 = "Type 5";
String type6 = "Type 6";
String type7 = "Type 7";
String type8 = "Type 8";
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, type1);
defaultcategorydataset.addValue(4D, series1, type2);
defaultcategorydataset.addValue(3D, series1, type3);
defaultcategorydataset.addValue(5D, series1, type4);
defaultcategorydataset.addValue(5D, series1, type5);
defaultcategorydataset.addValue(7D, series1, type6);
defaultcategorydataset.addValue(7D, series1, type7);
defaultcategorydataset.addValue(8D, series1, type8);

defaultcategorydataset.addValue(5D, series2, type1);
defaultcategorydataset.addValue(7D, series2, type2);
defaultcategorydataset.addValue(6D, series2, type3);
defaultcategorydataset.addValue(8D, series2, type4);
defaultcategorydataset.addValue(4D, series2, type5);
defaultcategorydataset.addValue(4D, series2, type6);
defaultcategorydataset.addValue(2D, series2, type7);
defaultcategorydataset.addValue(1.0D, series2, type8);

defaultcategorydataset.addValue(4D, series3, type1);
defaultcategorydataset.addValue(3D, series3, type2);
defaultcategorydataset.addValue(2D, series3, type3);
defaultcategorydataset.addValue(3D, series3, type4);
defaultcategorydataset.addValue(6D, series3, type5);
defaultcategorydataset.addValue(3D, series3, type6);
defaultcategorydataset.addValue(4D, series3, type7);
defaultcategorydataset.addValue(3D, series3, type8);
return defaultcategorydataset;
}
B、由ChartFactory 产生 JFreeChart 对象 (与上面重复的部分׃再注释)
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createLineChart("Line Chart Demo 1",
"Type",
"Value",
categorydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setRangeGridlinePaint(Color.white);
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
//获得renderer 注意q里是下嗍造型到lineandshaperendererQ!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setShapesVisible(true); //series 点(x据点Q可?
lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
10F, 6F
}, 0.0F)); //定义series?First"的(即series1Q点之间的连U?Q这里是虚线Q默认是直线
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
6F, 6F
}, 0.0F)); //定义series?Second"的(即series2Q点之间的连U?
lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
2.0F, 6F
}, 0.0F)); //定义series?Third"的(即series3Q点之间的连U?
return jfreechart;
}
一些重要的ҎQ?
lineandshaperenderer.setLineVisible(true) //series 点(x据点Q间有连U可?
2、XYDataset 接口Q?
A、创Z个数据源QdatasetQ:
private static XYDataset createDataset()
{
XYSeries xyseries = new XYSeries("First"); //先生XYSeries 对象
xyseries.add(1.0D, 1.0D);
xyseries.add(2D, 4D);
xyseries.add(3D, 3D);
xyseries.add(4D, 5D);
xyseries.add(5D, 5D);
xyseries.add(6D, 7D);
xyseries.add(7D, 7D);
xyseries.add(8D, 8D);

XYSeries xyseries1 = new XYSeries("Second");
xyseries1.add(1.0D, 5D);
xyseries1.add(2D, 7D);
xyseries1.add(3D, 6D);
xyseries1.add(4D, 8D);
xyseries1.add(5D, 4D);
xyseries1.add(6D, 4D);
xyseries1.add(7D, 2D);
xyseries1.add(8D, 1.0D);

XYSeries xyseries2 = new XYSeries("Third");
xyseries2.add(3D, 4D);
xyseries2.add(4D, 3D);
xyseries2.add(5D, 2D);
xyseries2.add(6D, 3D);
xyseries2.add(7D, 6D);
xyseries2.add(8D, 3D);
xyseries2.add(9D, 4D);
xyseries2.add(10D, 3D);

XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //再用XYSeriesCollectiond入XYSeries 对象
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries1);
xyseriescollection.addSeries(xyseries2);
return xyseriescollection;
}
B、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2",
"X",
"Y",
xydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plotQXYPlotQ!
xyplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //讑֮坐标轴与图表数据昄部分距离
xyplot.setDomainGridlinePaint(Color.white); //|格UK?
xyplot.setRangeGridlinePaint(Color.white);
//获得 renderer 注意q里是XYLineAndShapeRenderer Q!
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(true); //数据点可?
xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return jfreechart;
}
一些重要的ҎQ?
XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
xylineandshaperenderer.setSeriesLinesVisible(0, false); //W一个XYSeries数据炚wq线不可?
xylineandshaperenderer.setSeriesShapesVisible(1, false); //W二个XYSeries数据点不可见
xyplot.setRenderer(xylineandshaperenderer);

五、时间序列图
旉序列囑֒折线囑־怼Q不同的是它?domain轴的数据是时间而不是数字?旉序列囄dataset ?
XYDataset 接口Q具体实现类是TimeSeriesCollection Q和上面cMQ有TimeSeries 对象Q它被添加入
TimeSeriesCollection ?
1、创Z个数据源QdatasetQ:
private static XYDataset createDataset()
{
TimeSeries timeseries = new TimeSeries("L&G European Index Trust",Month.class);
timeseries.add(new Month(2, 2001), 181.8D);//q里用的是Month.classQ同栯有Day.class Year.class {等
timeseries.add(new Month(3, 2001), 167.3D);
timeseries.add(new Month(4, 2001), 153.8D);
timeseries.add(new Month(5, 2001), 167.6D);
timeseries.add(new Month(6, 2001), 158.8D);
timeseries.add(new Month(7, 2001), 148.3D);
timeseries.add(new Month(8, 2001), 153.9D);
timeseries.add(new Month(9, 2001), 142.7D);
timeseries.add(new Month(10, 2001), 123.2D);
timeseries.add(new Month(11, 2001), 131.8D);
timeseries.add(new Month(12, 2001), 139.6D);
timeseries.add(new Month(1, 2002), 142.9D);
timeseries.add(new Month(2, 2002), 138.7D);
timeseries.add(new Month(3, 2002), 137.3D);
timeseries.add(new Month(4, 2002), 143.9D);
timeseries.add(new Month(5, 2002), 139.8D);
timeseries.add(new Month(6, 2002), 137D);
timeseries.add(new Month(7, 2002), 132.8D);

TimeSeries timeseries1 = new TimeSeries("L&G UK Index Trust",Month.class);
timeseries1.add(new Month(2, 2001), 129.6D);
timeseries1.add(new Month(3, 2001), 123.2D);
timeseries1.add(new Month(4, 2001), 117.2D);
timeseries1.add(new Month(5, 2001), 124.1D);
timeseries1.add(new Month(6, 2001), 122.6D);
timeseries1.add(new Month(7, 2001), 119.2D);
timeseries1.add(new Month(8, 2001), 116.5D);
timeseries1.add(new Month(9, 2001), 112.7D);
timeseries1.add(new Month(10, 2001), 101.5D);
timeseries1.add(new Month(11, 2001), 106.1D);
timeseries1.add(new Month(12, 2001), 110.3D);
timeseries1.add(new Month(1, 2002), 111.7D);
timeseries1.add(new Month(2, 2002), 111D);
timeseries1.add(new Month(3, 2002), 109.6D);
timeseries1.add(new Month(4, 2002), 113.2D);
timeseries1.add(new Month(5, 2002), 111.6D);
timeseries1.add(new Month(6, 2002), 108.8D);
timeseries1.add(new Month(7, 2002), 101.6D);
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
timeseriescollection.setDomainIsPointsInTime(true); //domain轴上的刻度点代表的是旉点而不是时间段
return timeseriescollection;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal & General Unit Trust Prices",
"Date",
"Price Per Unit",
xydataset,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!!
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
xyplot.setDomainCrosshairVisible(true);
xyplot.setRangeCrosshairVisible(true);
org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();
if(xyitemrenderer instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;
xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可?
xylineandshaperenderer.setDefaultShapesFilled(true); //数据Ҏ实心?
}
DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期昄格式定义
dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
return jfreechart;
}
一些重要的ҎQ?
A、增加标记线Q?
xyplot.addRangeMarker(new ValueMarker(550D)); //数Du
Quarter quarter = new Quarter(2, 2002);
xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //旉?
B、数据点的调?
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可?
xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //数据点填充ؓU色
xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //数据点填充ؓ白色
xylineandshaperenderer.setUseFillPaint(true); //应用
C、^均值曲U?
q个曲线有什么用呢?很简单的例子Q这里有一个以半年每天为单位的数据l制的曲U,我们想看看以月ؓ单位数据
的变化,q时可以用到它了?
TimeSeries timeseries = createEURTimeSeries(); //是以半q每天ؓ单位的数?
TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
"30 day moving average",
30, //30天ؓ一个周?
30); //最开始的30天蟩q?
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;

六、ȝ一?/span>
dataset plot renderer
饼图 PieDatasetQDefaultPieDatasetQ?PiePlot ------
q?CatagoryDatasetQDefaultCategoryDatasetQ?CategoryPlot BarRenderer
折线?CatagoryDatasetQDefaultCategoryDatasetQ?CategoryPlot LineAndShapeRenderer
XYDatasetQXYSeriesCollectionQ?XYPlot XYLineAndShapeRenderer
旉序列?XYDataset QTimeSeriesCollectionQ?XYPlot XYLineAndShapeRenderer
q里只是一些常用的ҎQ具体还是看API
七、Item Lable
q里以柱状图Z说明Q具体来说就是在每个q上显C它的数据,具体有下面内容:
A、 Item Lable 可见
B、调?Item Lable 的颜艌Ӏ字体等
C、调?Item Lable 的位|?
D、定?Item Lable 的内?
1、分配一?Lable Generator l?renderer
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator =new StandardGategoryLableGenerator(
"{2}", new DecimalFormat("0.00") //调整昄的数字和字符格式
);
barrenderer.setLableGenerator(generator);
2、 Item Lable 可见
barrenderer.setItemLableVisible(true);
3、调?Item Lable 的颜艌Ӏ字体等
barrenderer.setItemLablePaint(Color.red);
barrenderer.setItemLableFont(new Font("SansSerif",Font.PLAIN,10));
4、调?Item Lable 的位|?
q里涉及C个新的对?ItemLablePosition , ItemLablePosition的构造函数有两个或四个参?
public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
org.jfree.ui.TextAnchor textAnchor,
org.jfree.ui.TextAnchor rotationAnchor,
double angle)
itemLabelAnchor - Item Lable 的位|?Q最重要的!Q)
textAnchor - Item Lable里包含的正文相对于Item Lable 的位|?
rotationAnchor - Item Lable里包含的正文旋{的位|?
angle - 旋{的角?
ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,
-1.57D);
barrenderer.setPositiveItemLabelPosition(itemlabelposition);
q样可以每个柱状上昄它的数据了,当然可以定制 Item Lable 的内容,比如 Item Lable text 过100的才
昄Q这样就需要定制自qc,它要实现GategoryLableGenerator 接口Q实现generateItemLable()Ҏ


]]>
վ֩ģ壺 | | | | ͬ| | ϽϽ| | | ̨| Ӣɳ| ϳ| ɳ| | | Ԫ| ³| Dz| | | | | ±| ͳ| | | ԭ| | | | ϻ| ˳| ɽ| | | ˮ| ̫| | | ̨| ں|