??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲三级av,波多野结衣亚洲,国产精品99精品久久免费http://www.aygfsteel.com/matthew2006/archive/2006/08/14/63475.htmlmatthewmatthewMon, 14 Aug 2006 06:39:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/08/14/63475.htmlhttp://www.aygfsteel.com/matthew2006/comments/63475.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/08/14/63475.html#Feedback0http://www.aygfsteel.com/matthew2006/comments/commentRss/63475.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/63475.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条是否可见



———————————————————————————————————?br />

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

———————————————————————————————————?br />

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 />

———————————————————————————————————?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 />

———————————————————————————————————?br />

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围区?br />

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中钻取链接格?br />

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

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

———————————————————————————————————?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:
没有Ҏ的设|?/p>




matthew 2006-08-14 14:39 发表评论
]]>
ZJ2EE的面向对象型数据的报表系l的设计与实玎ͼ转脓http://www.aygfsteel.com/matthew2006/archive/2006/08/14/63473.htmlmatthewmatthewMon, 14 Aug 2006 06:35:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/08/14/63473.htmlhttp://www.aygfsteel.com/matthew2006/comments/63473.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/08/14/63473.html#Feedback0http://www.aygfsteel.com/matthew2006/comments/commentRss/63473.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/63473.html一、jFreeChart产生囑Ş的流E?/span>
创徏一个数据源QdatasetQ来包含要在图形中昄的数?????>>创徏一?JFreeChart 对象来代表要昄的图?br />??????>>把图形输?br />重要的类和接口:
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调?br />注意Q它有很多子c,一般都下嗍造型到它的子c!
org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它,然后再通过它对囑Ş内部部分
Q例Q折U的cdQ调整。同P针对不同cd的报表图Q它?br />着不同的子cd玎ͼ在下面我们简U它?Renderer
下面我们l合不同cd的图形来具体分析q个程?br />
二、饼?/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?br />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); //讑֮图表数据昄部分背景?br />categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色
categoryplot.setDomainGridlinesVisible(true); //可见
categoryplot.setRangeGridlinePaint(Color.white); //U坐标网格线白色
//下面两行使纵坐标的最单位格为整?br />NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意q里是下嗍造型
到BarRendererQ!
barrenderer.setDrawBarOutline(false); // Bar的外轮廓U不?br />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讑֮上面定义的颜?br />barrenderer.setSeriesPaint(1, gradientpaint1); //lseries2 Bar 讑֮上面定义的颜?br />barrenderer.setSeriesPaint(2, gradientpaint2); //lseries3 Bar 讑֮上面定义的颜?br />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?br />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可?br />lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
10F, 6F
}, 0.0F)); //定义series为”First”的Q即series1Q点之间的连U?Q这里是虚线Q默认是直线
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
6F, 6F
}, 0.0F)); //定义series为”Second”的Q即series2Q点之间的连U?br />lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
2.0F, 6F
}, 0.0F)); //定义series为”Third”的Q即series3Q点之间的连U?br />return jfreechart;
}
一些重要的ҎQ?br />lineandshaperenderer.setLineVisible(true) //series 点(x据点Q间有连U可?br />2、XYDataset 接口Q?br />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); //讑֮图表数据昄部分背景?br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //讑֮坐标轴与图表数据昄部分距离
xyplot.setDomainGridlinePaint(Color.white); //|格UK?br />xyplot.setRangeGridlinePaint(Color.white);
//获得 renderer 注意q里是XYLineAndShapeRenderer Q!
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(true); //数据点可?br />xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return jfreechart;
}
一些重要的ҎQ?br />XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
xylineandshaperenderer.setSeriesLinesVisible(0, false); //W一个XYSeries数据炚wq线不可?br />xylineandshaperenderer.setSeriesShapesVisible(1, false); //W二个XYSeries数据点不可见
xyplot.setRenderer(xylineandshaperenderer);

五、时间序列图
旉序列囑֒折线囑־怼Q不同的是它?domain轴的数据是时间而不是数字?旉序列囄dataset ?br />XYDataset 接口Q具体实现类是TimeSeriesCollection Q和上面cMQ有TimeSeries 对象Q它被添加入
TimeSeriesCollection ?br />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); //数据点可?br />xylineandshaperenderer.setDefaultShapesFilled(true); //数据Ҏ实心?br />}
DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期昄格式定义
dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy?);
return jfreechart;
}
一些重要的ҎQ?br />A、增加标记线Q?br />xyplot.addRangeMarker(new ValueMarker(550D)); //数Du
Quarter quarter = new Quarter(2, 2002);
xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //旉?br />B、数据点的调?br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可?br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //数据点填充ؓU色
xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //数据点填充ؓ白色
xylineandshaperenderer.setUseFillPaint(true); //应用
C、^均值曲U?br />q个曲线有什么用呢?很简单的例子Q这里有一个以半年每天为单位的数据l制的曲U,我们想看看以月ؓ单位数据
的变化,q时可以用到它了?br />TimeSeries timeseries = createEURTimeSeries(); //是以半q每天ؓ单位的数?br />TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
?0 day moving average?
30, //30天ؓ一个周?br />30); //最开始的30天蟩q?br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;

六、ȝ一?/span>
dataset plot renderer
饼图 PieDatasetQDefaultPieDatasetQ?PiePlot —?br />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 的位|?br />D、定?Item Lable 的内?br />1、分配一?Lable Generator l?renderer
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator =new StandardGategoryLableGenerator(
“{2}? new DecimalFormat(?.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 的位|?br />q里涉及C个新的对?ItemLablePosition , ItemLablePosition的构造函数有两个或四个参?br />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 的位|?br />rotationAnchor - Item Lable里包含的正文旋{的位|?br />angle - 旋{的角?br />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()Ҏ


matthew 2006-08-14 14:35 发表评论
]]>
JFreeChart 初学http://www.aygfsteel.com/matthew2006/archive/2006/07/07/57143.htmlmatthewmatthewFri, 07 Jul 2006 07:26:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/07/07/57143.htmlhttp://www.aygfsteel.com/matthew2006/comments/57143.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/07/07/57143.html#Feedback4http://www.aygfsteel.com/matthew2006/comments/commentRss/57143.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/57143.html׃目需求原因,上网看了些JfreeChart的例子。自己就试着用了下:
BarCharDemo.jsp
<%@page contentType="text/html; charset=GB2312"%>

<%@page import="java.io.FileNotFoundException"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="org.apache.commons.logging.Log"%>
<%@page import="java.io.IOException"%>


<%@page import="org.apache.commons.logging.LogFactory"%>
<%@page import="org.jfree.chart.ChartFactory"%>
<%@page import="org.jfree.chart.ChartUtilities"%>
<%@page import="org.jfree.chart.JFreeChart"%>
<%@page import="org.jfree.chart.plot.PlotOrientation"%>
<%@page import="org.jfree.data.general.DefaultPieDataset"%>
<%@page import="org.jfree.data.general.PieDataset"%>
<%
DefaultPieDataset  dataset    = new DefaultPieDataset ();
  dataset.setValue("Ҏ",100); 
  dataset.setValue("?,200);
  dataset.setValue("香蕉",300);
  dataset.setValue("芒果",400);
  dataset.setValue("葡萄",500);


   JFreeChart chart      = ChartFactory.createPieChart3D(
    "水果产量?,       //图标标题
    dataset,       //数据?br />    true,        //是否昄图例Q简单的p囑ֿLfasleQ?br />    false,        //是否生成工具
    false        //是否生成URL链接
    );

   
    ChartUtilities.writeChartAsJPEG(response.getOutputStream(),chart,640,370);
%>

PieChartDemo.jsp
<%@page contentType="text/html; charset=GB2312"%>

<%@page import="java.io.FileNotFoundException"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="org.apache.commons.logging.Log"%>
<%@page import="java.io.IOException"%>

<%@page import="org.apache.commons.logging.LogFactory"%>
<%@page import="org.jfree.chart.ChartFactory"%>
<%@page import="org.jfree.chart.ChartUtilities"%>
<%@page import="org.jfree.chart.JFreeChart"%>
<%@page import="org.jfree.chart.plot.PlotOrientation"%>
<%@page import="org.jfree.data.category.CategoryDataset"%>
<%@page import="org.jfree.data.category.DefaultCategoryDataset"%>
<%
DefaultCategoryDataset dataset    = new DefaultCategoryDataset();
 dataset.addValue(100, "北京", "Ҏ");
  dataset.addValue(130, "上v", "Ҏ");
  dataset.addValue(160, "q州", "Ҏ");
  dataset.addValue(200, "北京", "梨子");
  dataset.addValue(230, "上v", "梨子");
  dataset.addValue(260, "q州", "梨子");
  dataset.addValue(300, "北京", "葡萄");
  dataset.addValue(330, "上v", "葡萄");
  dataset.addValue(360, "q州", "葡萄");
  dataset.addValue(400, "北京", "香蕉");
  dataset.addValue(430, "上v", "香蕉");
  dataset.addValue(460, "q州", "香蕉");
  dataset.addValue(500, "北京", "荔枝");
  dataset.addValue(530, "上v", "荔枝");
  dataset.addValue(560, "q州", "荔枝");
 
    JFreeChart chart      = ChartFactory.createBarChart3D(
    "水果产量?,       //图标标题
    "水果",        //目录轴显C标{?Qx_
    "产量",        //数据轴显C标{?Qy_
    dataset,       //数据?br />    PlotOrientation.VERTICAL,   //图标方向Q水qI垂直
    true,        //是否昄图例Q简单的p囑ֿLfasleQ?br />    false,        //是否生成工具
    false        //是否生成URL链接
    );
   
    ChartUtilities.writeChartAsJPEG(response.getOutputStream(),chart,640,370);
%>

TimeSeriesDemoQ在面上显C)
首先配置web.xml
 <servlet>
  <servlet-name>DisplayChart</servlet-name>
  <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
 </servlet>
 
 
 <servlet-mapping>
  <servlet-name>DisplayChart</servlet-name>
  <url-pattern>/servlet/DisplayChart</url-pattern>
 </servlet-mapping>


TimeSeriesDemo.java

package net.neitbe.home.jfreechart.business;

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.io.IOException;

import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.TimeSeriesDataItem;

/**
 * @author neitbe
 */
public class TimeSeriesDemo {

 private static Log log    = LogFactory.getLog(TimeSeriesDemo.class);
 
 //曲线图标?br /> private String title    = "势分析";
 //曲线图X轴提C?br /> private String domain    = "月䆾走势";
 //曲线图Y轴提C?br /> private String range    = "应收余额";
 //曲线图自标题
 private String subtitleStr   = "2005财年分析";
 
 //创徏旉数据?br /> //每一个TimeSeries在图上是一条曲U?br /> private TimeSeries yongyou    = new TimeSeries("用友");
 private TimeSeries jindie    = new TimeSeries("金碟");
 private TimeSeries dongruan    = new TimeSeries("东Y");
 
 //旉曲线数据集合
 private static TimeSeriesCollection dataset = new TimeSeriesCollection();


 private void setDataset() {
  dataset.removeAllSeries();        //在javaBean中用此c这个很重要Q不然会不停的加入新的TimeSeries;
  dataset.addSeries(this.yongyou);
  dataset.addSeries(this.jindie);
  dataset.addSeries(this.dongruan);
  
 }

 private void setDongruan() {
  this.dongruan.clear();     //很重要,不然会报?br />  /**
   * 报错
   * org.apache.jasper.JasperException: You are attempting to add an observation for the time period
   * q里是在cd性里声明TimeSeries才用到的
   */
  for(int i = 1999; i < 2005; i++) {
   for(int mon = 0; mon < 12; mon++) {
    
    this.dongruan.add(new TimeSeriesDataItem(new Day(1,mon+1,i),new Double(300 - Math.random()*100)));
   }
  }
 }

 private void setJindie() {
  
  this.jindie.clear();    //很重要,不然会报?br />  for(int i = 1999; i < 2005; i++) {
   for(int mon = 0; mon < 12; mon++) {
    this.jindie.add(new TimeSeriesDataItem(new Day(1,mon+1,i),new Double(400 - Math.random()*100)));
   }
  }
 }

 

 private void setYongyou() {
  this.yongyou.clear();   //很重要,不然会报?br />  for(int i = 1999; i < 2005; i++) {
   for(int mon = 0; mon < 12; mon++) {
    this.yongyou.add(new TimeSeriesDataItem(new Day(1,mon+1,i),new Double(500 - Math.random()*100)));
   }
  }
  
 }

 private TimeSeriesCollection getDataset() {
  this.setDongruan();
  this.setJindie();
  this.setYongyou();
  this.setDataset();
  return dataset;
 }
 
 public String drawPic(HttpSession session) {
  String fileName       = null;
  JFreeChart chart      = ChartFactory.createTimeSeriesChart(title,domain,range,getDataset(),true,true,false);
  TextTitle subTitle      = new TextTitle(subtitleStr,new Font("黑体",Font.BOLD,12));
  chart.addSubtitle(subTitle);
  chart.setTitle(new TextTitle(title,new Font("隶书",Font.ITALIC,15)));
  chart.setBorderPaint(new GradientPaint(0,0,Color.white,0,1000,Color.blue));
  //String fileName       = "D:\\fuit2.jpeg";
  try {
   ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());


   log.debug("准备创徏囄…?);
   fileName       = ServletUtilities.saveChartAsJPEG(chart,600,600,info,session);
   log.debug("囄创徏成功Q?);
  } catch (IOException e) {
   log.error("IO异常Q?,e);
  }
  log.debug("q回的文件名为:" + fileName);
  return fileName;
 }
 
 /*public static void main(String[] args) {
  TimeSeriesDemo timeSeriesDemo   = new TimeSeriesDemo();
  timeSeriesDemo.drawPic();
 }*/


 
}


index.jsp面Q?br /> <%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
<jsp:useBean id="timeSeries" scope="session" class="net.neitbe.home.jfreechart.business.TimeSeriesDemo"/>
</head>
<body>
<%
 String fileName   = timeSeries.drawPic(request.getSession());
 String graphURL   = request.getContextPath()+"/servlet/DisplayChart?filename=" + fileName;
%>
<%=graphURL%><br/>
<img src="<%= graphURL %>" width="400" height="400" border="1"/>
</body>
</html>



matthew 2006-07-07 15:26 发表评论
]]>
Jasperreportq箋打印多个报表模板Q原?/title><link>http://www.aygfsteel.com/matthew2006/archive/2006/07/01/56099.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 01 Jul 2006 08:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/matthew2006/archive/2006/07/01/56099.html</guid><wfw:comment>http://www.aygfsteel.com/matthew2006/comments/56099.html</wfw:comment><comments>http://www.aygfsteel.com/matthew2006/archive/2006/07/01/56099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matthew2006/comments/commentRss/56099.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matthew2006/services/trackbacks/56099.html</trackback:ping><description><![CDATA[Jasperreportq箋打印多个报表模板Q这个问题一直困扰我很久。网上查了很多资料都没有具体的解军_法,通过查询jasperreport的API发现提供了解册个问题的Ҏ。以下是我的q程记录Q?br /><br /><strong>问题描述</strong>Q一般报表设计和打印中,主要是对单个报表模板q行数据填充、打印、导出。但是,也有个别情况需要连l打印多个报表模ѝ比如,政府机关的上报材料,属于一个完整的文档。如果一个一个模板打C昑־非常ȝ?br /><br /><strong>问题解决q程Q?/strong>一般我们导出报表文件是使用q个语句Q?br />exporter.setParamete(JRExporterParameter.JASPER_PRINT, jasperprint);但是它是对单个模板进行操作,通过查找jasperreport的API发现q提供了q样一个语句:<br />exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperprint);可以q箋对多个报表模板操作。它的方法是通过一个list来存储多个JasperPrint对象Q从而实现多个报表模板的打印。在我解决问题的q程中发现导出PDF文g格式比较单,但是导出WORD文档时发现编码格式出现问题,老是出现q。即使这? exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "GB2312");也没有用。后来浏览一脓子:“导出excel时出Cؕ码问题”,和我的问题差不多。终于大功告成!<img src ="http://www.aygfsteel.com/matthew2006/aggbug/56099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matthew2006/" target="_blank">matthew</a> 2006-07-01 16:52 <a href="http://www.aygfsteel.com/matthew2006/archive/2006/07/01/56099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jasper report 使用 hibernate 数据源性能优化http://www.aygfsteel.com/matthew2006/archive/2006/06/29/55810.htmlmatthewmatthewThu, 29 Jun 2006 12:00:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/06/29/55810.htmlhttp://www.aygfsteel.com/matthew2006/comments/55810.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/06/29/55810.html#Feedback0http://www.aygfsteel.com/matthew2006/comments/commentRss/55810.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/55810.html Q{_Autohr John Ferguson Smart Q?br />      ? 使用?hibernate 的分功能,对大数据量查询采用分D读入方法,避免了一ơ读入带来的性能下降Q一般在Tomcat 环境下,当List中的 Object > 10000 一般会D OutOfMemory?br />

Introduction
In the article, we examine a performance-optimised approach for using Hibernate queries to generate reports with JasperReports.

  JasperReports is a powerful and flexible Open Source reporting tool. Combined with the graphical design tool iReport, for example, you get a complete Java Open Source reporting solution. In this article, we will investigate how you can integrate JasperReports reporting with Hibernate data sources in an optimal manner, without sacrificing ease-of-use or performance.

  Basic Hibernate/JasperReports integration
To integrate Hibernate and JasperReports, you have to define a JasperReports data source. One simple and intuitive approach is to use the JRBeanCollectionDataSource data source (This approach is presented here) :

-------------------------------------------------------------------------------------------------------
List results = session.find("from com.acme.Sale");

  Map parameters = new HashMap();
  parameters.put("Title", "Sales Report");

  InputStream reportStream
            = this.class.getResourceAsStream("/sales-report.xml");
  JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
  JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(results);
  JasperPrint jasperPrint = JasperManager.fillReport(jasperReport,
                                    parameters,
                                    ds);

  JasperExportManager.exportReportToPdfFile(jasperPrint, "sales-report.pdf");

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

  This approach will work well for small lists. However, for reports involving tens or hundreds of thousands of lines, it is inefficiant, memory-consuming, and slow. Indeed, experience shows that, when running on a standard Tomcat configuration, a list returning as few as 10000 business objects can cause OutOfMemory exceptions. It also wastes time building a bulky list of objects before processing them, and pollutes the Hibernate session (and possibly second-level caches with temporary objects.

Optimised Hibernate/JasperReports integration
We need a way to efficiently read and process Hibernate queries, without creating too many unnecessary temporary objects in memory. One possible way to do this is the following :

Define an optimised layer for executing Hibernate queries efficiently
Define an abstraction layer for these classes which is compatible with JasperReports
Wrap this data access layer in a JasperReports class that can be directly plugged into JasperReports
The Hibernate Data Access Layer : The QueryProvider interface and its implementations
We start with the optimised Hibernate data access. (you may note that this layer is not actually Hibernate-specific, so other implementations could implement other types of data access without impacting the design).

This layer contains two principal classes :

The CriteriaSet class
The QueryProvider interface


  A CriteriaSet is simply a JavaBean which contains parameters which may be passed to the Hibernate query. It is simply a generic way of encapsulating a set of parameters. A QueryProvider provides a generic way of returning an arbitrary subset of the query results set. The essential point is that query results are read in small chunks, not all at once. This allows more efficient memory handling and better performance.


------------------------------------------------------------------------------------------------------------
/**
  * A QueryProvidor provides a generic way of fetching a set of objects.
  */
  public interface QueryProvider {

    /**
      * Return a set of objects based on a given criteria set.
      * @param firstResult the first result to be returned
      * @param maxResults the maximum number of results to be returned
      * @return a list of objects
      */
    List getObjects(CriteriaSet criteria,
                int firstResult,
                int maxResults) throws HibernateException;
  }
----------------------------------------------------------------------------------------------------------

  A typical implementation of this class simply builds a Hibernate query using the specified criteria set and returns the requested subset of results. For example :

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

public class ProductQueryProvider implements QueryProvider {

    public List getObjects(CriteriaSet criteria,
                    int firstResult,
                    int maxResults)
          throws HibernateException {
      //
      // Build query criteria
      //
      Session sess = SessionManager.currentSession();
      ProductCriteriaSet productCriteria
                      = (ProductCriteriaSet) criteria;
      Query query = session.find("from com.acme.Product p "
              + "where p.categoryCode = :categoryCode ");

      query.setParameter("categoryCode",
                    productCriteria.getCategoryCode();
      return query.setCacheable(true)
              .setFirstResult(firstResult)
              .setMaxResults(maxResults)
              .setFetchSize(100)
              .list();
    }
  }
-------------------------------------------------------------------------------------------------

  A more sophisticated implementation is helpful for dynamic queries. We define an abstract BaseQueryProvider class which can be used for dynamic query generation. This is typically useful when the report has to be generated using several parameters, some of which are optionnal.. Each derived class overrides the buildCriteria() method. This method builds a Hibernate Criteria object using the specified Criteria set as appropriate :

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

public abstract class BaseQueryProvider implements QueryProvider {

    public List getObjects(CriteriaSet criteria, int firstResult, int maxResults)
          throws HibernateException {

          Session sess = SessionManager.currentSession();
          Criteria queryCriteria = buildCriteria(criteria, sess);
          return queryCriteria.setCacheable(true)
                  .setFirstResult(firstResult)
                  .setMaxResults(maxResults)
                  .setFetchSize(100)
                  .list();

    }

    protected abstract Criteria buildCriteria(CriteriaSet criteria, Session sess);
  }
-------------------------------------------------------------------------------------------------

A typical implementation is shown here :

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

public class SalesQueryProvider extends BaseQueryProvider {

    protected Criteria buildCriteria(CriteriaSet criteria,
                          Session sess) {
      //
      // Build query criteria
      //
      SalesCriteriaSet salesCriteria
                  = (SalesCriteriaSet) criteria;

      Criteria queryCriteria
                  = sess.createCriteria(Sale.class);

      if (salesCriteria.getStartDate() != null) {
          queryCriteria.add(
              Expression.eq("getStartDate",
                        salesCriteria.getStartDate()));
      }
      // etc...

      return queryCriteria;
    }
  }
------------------------------------------------------------------------------------------------

  Note that a QueryProvider does not need to return Hibernate-persisted objects. Large-volume queries can sometimes be more efficiently implemented by returning custom-made JavaBeans containing just the required columns. HQL allows you to to this quite easily :

---------------------------------------------------------------------------------------------------
public class CityQueryProvider implements QueryProvider {

    public List getObjects(CriteriaSet criteria,
                    int firstResult,
                    int maxResults)
          throws HibernateException {
      //
      // Build query criteria
      //
      Session sess = SessionManager.currentSession();
      Query query
            = session.find(
                "select new CityItem(city.id, "
              + "             city.name, "
              + "         city.electrityCompany.name) "
              + " from City city "
              + " left join city.electrityCompany");

      return query.setCacheable(true)
              .setFirstResult(firstResult)
              .setMaxResults(maxResults)
              .setFetchSize(100)
              .list();
    }
  }
-------------------------------------------------------------------------------------------------

Hibernate data access abstraction : the ReportDataSource interface
Next, we define a level of abstraction between the Hibernate querying and the JasperReport classes. The ReportDataSource does this :

--------------------------------------------------------------------------------------------------
public interface ReportDataSource extends Serializable {
    Object getObject(int index);
  }


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

  The standard implementation of this interface reads Hibernate objects using a given QueryProvider and returns them to JasperReports one by one. Here is the source code of this class (getters, setters, logging code and error-handling code have been removed for clarty) :

---------------------------------------------------------------------------------------------------
public class ReportDataSourceImpl implements ReportDataSource {

    private CriteriaSet criteriaSet;
    private QueryProvider queryProvider;
    private List resultPage;
    private int pageStart = Integer.MAX_VALUE;
    private int pageEnd = Integer.MIN_VALUE;
    private static final int PAGE_SIZE = 50;

    //
    // Getters and setters for criteriaSet and queryProvider
    //
    ...

    public List getObjects(int firstResult,
                    int maxResults) {

        List queryResults = getQueryProvider()
                      .getObjects(getCriteriaSet(),
                              firstResult,
                              maxResults);
        if (resultPage == null) {
          resultPage = new ArrayList(queryResults.size());
        }
        resultPage.clear();
        for(int i = 0; i < queryResults.size(); i++) {
          resultPage.add(queryResults.get(i));
        }
        pageStart = firstResult;
        pageEnd = firstResult + queryResults.size() - 1;
        return resultPage;
    }
public final Object getObject(int index) {
      if ((resultPage == null)
          || (index < pageStart)
          || (index > pageEnd)) {
          resultPage = getObjects(index, PAGE_SIZE);
      }
      Object result = null;
      int pos = index - pageStart;
      if ((resultPage != null)
          && (resultPage.size() > pos)) {
          result = resultPage.get(pos);
      }
      return result;
    }
  }

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

Finally, we have to be able to call the Hibernate data source from JasperReports. To do so, we start by looking at the JasperManager fillReport() method, which takes a JRDataSource object as its third parameter and uses it to generate the report :

---------------------------------------------------------------------------------------------------
JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

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


To implement our own optimised JRDataSource, we extended the JRAbstractBeanDataSource class. This class is presented here (logging and error-handling code has been removed for clarty).

---------------------------------------------------------------------------------------------------
public class ReportSource extends JRAbstractBeanDataSource {

    private ReportDataSource dataSource;
    protected int index = 0;
    protected Object bean;
    private static Map fieldNameMap = new HashMap();

    public ReportSource(ReportDataSource dataSource) {
      super(true);
      this.dataSource = dataSource;
      index = 0;
    }

    public boolean next() throws JRException {
      bean = dataSource.getObject(index++);
      return (bean != null);
    }

    public void moveFirst() throws JRException {
      index = 0;
      bean = dataSource.getObject(index);
    }

    public Object getFieldValue(JRField field) throws JRException {
      String nameField = getFieldName(field.getName());
      return PropertyUtils.getProperty(bean, nameField);
    }
/**
    * Replace the character "_" by a ".".
    *
    * @param fieldName the name of the field
    * @return the value in the cache or make
    * the replacement and return this value
    */
    private String getFieldName(String fieldName) {
      String filteredFieldName
          = (String) fieldNameMap.get(fieldName);
      if (filteredFieldName == null) {
          filteredFieldName = fieldName.replace('_','.');
          fieldNameMap.put(fieldName,filteredFieldName);
      }
      return filteredFieldName;
    }
  }

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

This class is basically just a proxy between JasperReports and the Hibernate data source object. The only tricky bit is field name handling. For some reason, JasperReports does not accept field names containing dots (ex. "product.code"). However, when you retrieve a set of Hibernate-persisted business objects, you often need to access object attributes. To get around this, we replace the "." by a "_" in the JasperReport template (ex. "product_code" instead of "product.code"), and convert back to a conventional JavaBean format in the getFieldName() method.

Putting it all together
So, when you put it all together, you get something like this :

---------------------------------------------------------------------------------------------------
List results = session.find("from com.acme.Sale");

  Map parameters = new HashMap();
  parameters.put("Title", "Sales Report");

  InputStream reportStream
          = this.class.getResourceAsStream("/sales-report.xml");
  JasperDesign jasperDesign
          = JasperManager.loadXmlDesign(reportStream);
  JasperReport jasperReport
          = JasperManager.compileReport(jasperDesign);
 
  ReportDataSource hibernateDataSource
          = new ReportDataSourceImpl();
  hibernateDataSource.setQueryProvider(new SalesQueryProvider());
  hibernateDataSource.setCriteriaSet(salesCriteria);
  ReportSource rs = new ReportSource(hibernateDataSource);
 
  JasperPrint jasperPrint
            = JasperManager.fillReport(jasperReport,
                              parameters,
                              rs);
  JasperExportManager.exportReportTsoPdfFile(jasperPrint,
                              "sales-report.pdf");

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

Further JasperReports optimisations

Compiled Report caching
In the previous code, the JasperReport is loaded and compiled before it is run. In a serverside application, for optimal performance, the reports should be loaded and compiled once and then cached. This will save several seconds on each query generation.

Optimising Hibernate Queries
The first cause of slow report generation is sub-optimal querying. Hibernate is a high-performance persistence library which gives excellent results when correctly used. So you should treate any report which takes an excessive time to generate as suspicious. Common Hibernate optimisation strategies include :

Correct use of joins
Correct use of lazy associations
Reading a subset of columns rather than whole Hibernate-persisted objects
Some Hibernate query optimisation techniques are discussed here.

Conclusion

JasperReports is a powerful and flexible reporting tool. To achieve high-performance Hibernate intergration however, some extra work is needed. One way is by writing optimised data access classes which can be plugged into the JasperReports architecture. Using this approach, you can take advantage of the full power of Hibernate in your JasperReports reporting solutions.



matthew 2006-06-29 20:00 发表评论
]]>
jasper report 使用 hibernate 数据??hibernate 官方|站提供)http://www.aygfsteel.com/matthew2006/archive/2006/06/29/55808.htmlmatthewmatthewThu, 29 Jun 2006 11:58:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/06/29/55808.htmlhttp://www.aygfsteel.com/matthew2006/comments/55808.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/06/29/55808.html#Feedback0http://www.aygfsteel.com/matthew2006/comments/commentRss/55808.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/55808.html ? 此方法用简单,但是没有分页d数据Q适合数据量不大情况下的报?br />
原文Q?/font> http://www.hibernate.org/79.html

Using JasperReports with Hibernate
This section will demonstrate a couple of ways to use the results of a Hibernate query as the datasource of a report in JasperReports.

When the Hibernate query returns a simple collection of objects, The JRBeanCollectionDataSource class in the JasperReports library will work fine.

--------------------------------------------------------------------------------------------------------
List cats = session.find("from eg.Cat");

Map parameters = new HashMap();
parameters.put("Title", "The Cat Report");

InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(cats);
JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

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

  However, when the Hibernate query returns tuples of objects (each tuple as an array, each array as an element in the returned List), things get a little tricky. Jasper needs a way to reference each object in the array by a field name. This class is a good solution, but at this time you are required to pass an array of field names matching the results of the query.

--------------------------------------------------------------------------------------------------------
public class HibernateQueryResultDataSource implements JRDataSource {

private String[] fields;
private Iterator iterator;
private Object currentValue;

public HibernateQueryResultDataSource(List list, String[] fields) {
  this.fields = fields;
  this.iterator = list.iterator();
}

public Object getFieldValue(JRField field) throws JRException {
  Object value = null;
  int index = getFieldIndex(field.getName());
  if (index > -1) {
    Object[] values = (Object[])currentValue;
    value = values[index];
  }
  return value;
}

public boolean next() throws JRException {
  currentValue = iterator.hasNext() ? iterator.next() : null;
  return (currentValue != null);
}

private int getFieldIndex(String field) {
  int index = -1;
  for (int i = 0; i < fields.length; i++) {
    if (fields
.equals(field)) {
    index = i;
    break;
    }
  }
  return index;
}

}

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

Now running your report would look something like this:


--------------------------------------------------------------------------------------------------------
List cats = session.find("select cat.type, cat.birthdate, cat.name from eg.DomesticCat cat");

Map parameters = new HashMap();
parameters.put("Title", "The Cat Report");

InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

String[] fields = new String[] { "type", "birthdate", "name"};
HibernateQueryResultDataSource ds = new HibernateQueryResultDataSource(cats, fields);
JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

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


Another, alternate implementation, from Erik Romson:


--------------------------------------------------------------------------------------------------------
public class HibernateQueryResultDataSource implements JRDataSource
{
  private static final transient Logger logger =
    Logger.Factory.getInstance(HibernateQueryResultDataSource.class);
  protected HashMap fieldsToIdxMap=new HashMap();
  protected Iterator iterator;
  protected Object currentValue;
  List values;

  public HibernateQueryResultDataSource(List list, String query)
  {
    int start =query.indexOf("select ");
    int stop =query.indexOf(" from ");
    Assertion.assertTrue(
      (start!=-1) &&
      (stop!=-1),
      "The query "+
      query+
      " must be of the form select x,x from ..."
    );
    start+="select".length();
    String parameters=query.substring(start,stop);
    parameters=parameters.trim();
    Assertion.assertTrue(
        parameters.length()>0,
        "The query "+
        query+
        " seems to be weird"
    );
    StringTokenizer tokenizer=new StringTokenizer(parameters,",");
    int idx=0;
    while( tokenizer.hasMoreTokens() )
    {
        String parameter=tokenizer.nextToken();
        fieldsToIdxMap.put( parameter.trim(), new Integer(idx) );
        idx++;
    }
    values=list;
    this.iterator = list.iterator();
  }
public Object getFieldValue(JRField field) throws JRException
  {
    String fieldName=field.getName().replace('_','.');
    //JasperReports does not allow '.' in field names, so we
    //use '_' for nested properties instead and must convert here
    //(comment added by kbrown)
    Integer idxInt=(Integer) fieldsToIdxMap.get(fieldName);
    if (idxInt==null)
    {
        Assertion.fail(
          "The field \""+
          fieldName+
          "\" did not have an index mapping. Should be one off "+
          fieldsToIdxMap.keySet()
        );
    }
    Object[] values = (Object[]) currentValue;
    Assertion.assertTrue(
        idxInt.intValue()
        "The index from field "+
        fieldName+
        " was illegal"
    );
    Object value= values[ idxInt.intValue() ];
    if ( logger.isDebugEnabled() )
    {
        logger.debug("fetched value "+value+" from field "+fieldName);
    }
    return value;
  }

  public boolean next() throws JRException
  {
    currentValue = iterator.hasNext() ? iterator.next() : null;
    return currentValue != null;
  }

  public List getValues()
  {
    return values;
  }
}

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

Using JasperReports with Hibernate
This section will demonstrate a couple of ways to use the results of a Hibernate query as the datasource of a report in JasperReports.

When the Hibernate query returns a simple collection of objects, The JRBeanCollectionDataSource class in the JasperReports library will work fine.

List cats = session.find("from eg.Cat");

Map parameters = new HashMap();
parameters.put("Title", "The Cat Report");

InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(cats);
JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");
However, when the Hibernate query returns tuples of objects (each tuple as an array, each array as an element in the returned List), things get a little tricky. Jasper needs a way to reference each object in the array by a field name. This class is a good solution, but at this time you are required to pass an array of field names matching the results of the query.

public class HibernateQueryResultDataSource implements JRDataSource {

private String[] fields;
private Iterator iterator;
private Object currentValue;

public HibernateQueryResultDataSource(List list, String[] fields) {
  this.fields = fields;
  this.iterator = list.iterator();
}

public Object getFieldValue(JRField field) throws JRException {
  Object value = null;
  int index = getFieldIndex(field.getName());
  if (index > -1) {
    Object[] values = (Object[])currentValue;
    value = values[index];
  }
  return value;
}

public boolean next() throws JRException {
  currentValue = iterator.hasNext() ? iterator.next() : null;
  return (currentValue != null);
}

private int getFieldIndex(String field) {
  int index = -1;
  for (int i = 0; i < fields.length; i++) {
    if (fields
.equals(field)) {
    index = i;
    break;
    }
  }
  return index;
}

}
Now running your report would look something like this:

List cats = session.find("select cat.type, cat.birthdate, cat.name from eg.DomesticCat cat");

Map parameters = new HashMap();
parameters.put("Title", "The Cat Report");

InputStream reportStream = this.class.getResourceAsStream("/the-cat-report.xml");
JasperDesign jasperDesign = JasperManager.loadXmlDesign(reportStream);
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

String[] fields = new String[] { "type", "birthdate", "name"};
HibernateQueryResultDataSource ds = new HibernateQueryResultDataSource(cats, fields);
JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);

JasperManager.printReportToPdfFile(jasperPrint, "the-cat-report.pdf");

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

Another, alternate implementation, from Erik Romson:

public class HibernateQueryResultDataSource implements JRDataSource
{
  private static final transient Logger logger =
    Logger.Factory.getInstance(HibernateQueryResultDataSource.class);
  protected HashMap fieldsToIdxMap=new HashMap();
  protected Iterator iterator;
  protected Object currentValue;
  List values;

  public HibernateQueryResultDataSource(List list, String query)
  {
    int start =query.indexOf("select ");
    int stop =query.indexOf(" from ");
    Assertion.assertTrue(
      (start!=-1) &&
      (stop!=-1),
      "The query "+
      query+
      " must be of the form select x,x from ..."
    );
    start+="select".length();
    String parameters=query.substring(start,stop);
    parameters=parameters.trim();
    Assertion.assertTrue(
        parameters.length()>0,
        "The query "+
        query+
        " seems to be weird"
    );
    StringTokenizer tokenizer=new StringTokenizer(parameters,",");
    int idx=0;
    while( tokenizer.hasMoreTokens() )
    {
        String parameter=tokenizer.nextToken();
        fieldsToIdxMap.put( parameter.trim(), new Integer(idx) );
        idx++;
    }
    values=list;
    this.iterator = list.iterator();
  }

  public Object getFieldValue(JRField field) throws JRException
  {
    String fieldName=field.getName().replace('_','.');
    //JasperReports does not allow '.' in field names, so we
    //use '_' for nested properties instead and must convert here
    //(comment added by kbrown)
    Integer idxInt=(Integer) fieldsToIdxMap.get(fieldName);
    if (idxInt==null)
    {
        Assertion.fail(
          "The field \""+
          fieldName+
          "\" did not have an index mapping. Should be one off "+
          fieldsToIdxMap.keySet()
        );
    }
    Object[] values = (Object[]) currentValue;
    Assertion.assertTrue(
        idxInt.intValue()
        "The index from field "+
        fieldName+
        " was illegal"
    );
    Object value= values[ idxInt.intValue() ];
    if ( logger.isDebugEnabled() )
    {
        logger.debug("fetched value "+value+" from field "+fieldName);
    }
    return value;
  }

  public boolean next() throws JRException
  {
    currentValue = iterator.hasNext() ? iterator.next() : null;
    return currentValue != null;
  }

  public List getValues()
  {
    return values;
  }
}

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

Using the information from this page I've made a patch to JasperReports 0.6.5. You can find the patch at:
http://www.waltermourao.com.br/JasperReports/jr65_hql.zip or you can download the full version from: http://www.waltermourao.com.br/JasperReports/jasperreports-hql-0.6.5.zip



matthew 2006-06-29 19:58 发表评论
]]>
JasperReport 用户手册Q{?/title><link>http://www.aygfsteel.com/matthew2006/archive/2006/06/07/51021.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Wed, 07 Jun 2006 01:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/matthew2006/archive/2006/06/07/51021.html</guid><wfw:comment>http://www.aygfsteel.com/matthew2006/comments/51021.html</wfw:comment><comments>http://www.aygfsteel.com/matthew2006/archive/2006/06/07/51021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matthew2006/comments/commentRss/51021.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matthew2006/services/trackbacks/51021.html</trackback:ping><description><![CDATA[     摘要: JasperReport 用户手册的翻? 1 ?        JasperReport 是一个强大、灵zȝ报表生成工具Q能够展CZ富的面内容...  <a href='http://www.aygfsteel.com/matthew2006/archive/2006/06/07/51021.html'>阅读全文</a><img src ="http://www.aygfsteel.com/matthew2006/aggbug/51021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matthew2006/" target="_blank">matthew</a> 2006-06-07 09:30 <a href="http://www.aygfsteel.com/matthew2006/archive/2006/06/07/51021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jasperreport+ireport报表设计中遇到的问题http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50879.htmlmatthewmatthewTue, 06 Jun 2006 11:43:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/06/06/50879.htmlhttp://www.aygfsteel.com/matthew2006/comments/50879.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/06/06/50879.html#Feedback3http://www.aygfsteel.com/matthew2006/comments/commentRss/50879.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/50879.html问题1:最常见的问题就是中文问题,不能昄中文或者是q?br />解决办法Q在需要显CZ文的field里面(包括静态的)讄PDF font name:STSong-Light,PDF encoding:UniGB-UCS2-H (Chinese Simplified)。即可!

问题2:设计静态报表模板时Qword输出格式问题Q预览时LI白c?br />解决办法Q可以通过讄报表属性中的“当没有数据时的昄方式”ؓQ除detail外的所有地斏V?br />
问题3:当输出HTML格式报表时L出现I白问题?br />解决办法:原因是我用的jasperreport版本?.2.2,在这个版本中出现一个小bugQ就是编译输出的html源代码ؓ</title>QIE不能~译。办法是修改源码Q或者手工添加代码把</title>改ؓ<title></title>Q最后也可以把你的lib目录下的jasperreport的jar包的版本换ؓ1.2.1
....待箋


matthew 2006-06-06 19:43 发表评论
]]>
Ireport+Jasperreport报表设计Q{?/title><link>http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50873.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Tue, 06 Jun 2006 11:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50873.html</guid><wfw:comment>http://www.aygfsteel.com/matthew2006/comments/50873.html</wfw:comment><comments>http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matthew2006/comments/commentRss/50873.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matthew2006/services/trackbacks/50873.html</trackback:ping><description><![CDATA[     摘要: W一部分Q用iReport制作报表的详l过E(Windows环境下) 1 、前a 在网l上可以搜烦到很多? iReport ? Jasperreport 配合实现各种报表d的文章,但是我觉得很有一(几乎没有Q做一个比较详l的介绍如何使用...  <a href='http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50873.html'>阅读全文</a><img src ="http://www.aygfsteel.com/matthew2006/aggbug/50873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matthew2006/" target="_blank">matthew</a> 2006-06-06 19:11 <a href="http://www.aygfsteel.com/matthew2006/archive/2006/06/06/50873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java报表Qjasperreporthttp://www.aygfsteel.com/matthew2006/archive/2006/06/06/50868.htmlmatthewmatthewTue, 06 Jun 2006 10:53:00 GMThttp://www.aygfsteel.com/matthew2006/archive/2006/06/06/50868.htmlhttp://www.aygfsteel.com/matthew2006/comments/50868.htmlhttp://www.aygfsteel.com/matthew2006/archive/2006/06/06/50868.html#Feedback0http://www.aygfsteel.com/matthew2006/comments/commentRss/50868.htmlhttp://www.aygfsteel.com/matthew2006/services/trackbacks/50868.html

matthew 2006-06-06 18:53 发表评论
]]>
վ֩ģ壺 | | | | | ͷ| | Ͷ| Ҧ| ۽| | Ʊ| ѳ| | | | | | | ½| °Ͷ| | | | | | | °| | ͼľ| ϲ| | Ӣ| | Ԫ| ԭ| ÷| | ¹| | ±|