问题描述
前段时间,项目组有个业务需求,需要生成财务分析图表,开始采用的是FushionChart,因为这个简单,效果好看,功能也够强大,上线后不久,遇到了一个问题,就是用户需要将图表打印出来,没有彩色打印机,只有黑白打印机,所以光靠颜色来区分就很困难了。业务需求的老大对Excel挺熟的,他在Excel中画的图表是可以使用纹理填充的,黑白打印效果完全没问题。没有FunshionChart的源码,没办法改人家的东西,于是就找来了JFreeChart,可是这家伙好像也不支持使用纹理填充,网上搜了N久也没有现成的,倒是有和我们一样需求的人在问。没办法,只能自己先研究看看了,通过几天的百度,对JFreeChart有了大概的了解,知道了TexturePaint可以用来填充纹理,知道了BarRenderer可以对柱状图表进行修饰,通过代码跟踪,测试,终于试验成功了。主要代码如下,供有需要的人参考:privatestaticJFreeChartcreateChart(CategoryDatasetdataset){//createthechart...JFreeChartchart=ChartFactory.createStackedBarChart("BarChartDemo1",//charttitle"Category",//domainaxislabel"Value",//rangeaxislabeldataset,//dataPlotOrientation.VERTICAL,//orientationtrue,//includelegendtrue,//tooltips?false//URLs?);chart.setBackgroundPaint(Color.white);CategoryPlotplot=(CategoryPlot)chart.getPlot();NumberAxisrangeAxis=(NumberAxis)plot.getRangeAxis();rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());BarRendererrenderer=(BarRenderer)plot.getRenderer();renderer.setDrawBarOutline(true);renderer.setBarPainter(newTextureBarPainter());//这个是我自己实现的BarPainterrenderer.setSeriesPaint(0,getTexturePaint("1.png"));//.png是相应的纹理图片renderer.setSeriesPaint(1,getTexturePaint("2.png"));renderer.setSeriesPaint(2,getTexturePaint("3.png"));CategoryAxisdomainAxis=plot.getDomainAxis();domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI/6.0));returnchart;}privatestaticTexturePaintgetTexturePaint(StringtextureFile){BufferedImagebi=null;Rectangler=null;TexturePainttp=null;try{Filein=newFile("D:\texture\"+textureFile);bi=ImageIO.read(in);}catch(IOExceptione){e.printStackTrace();}r=newRectangle(0,0,bi.getWidth(),bi.getHeight());tp=newTexturePaint(bi,r);returntp;}//----------------------//TextureBarPainter主要代码publicvoidpaintBar(Graphics2Dg2,BarRendererrenderer,introw,intcolumn,RectangularShapebar,RectangleEdgebase){PaintitemPaint=renderer.getItemPaint(row,column);g2.setPaint(itemPaint);g2.fill(bar);}
解决方案
解决方案二:
运行效果图:
解决方案三:
[img=http://b59.photo.store.qq.com/http_imgload.cgi?/rurl4_b=9221724b03a323e0508bad38d8344c18beddbf16a355ebdcaaefac411f82d48023979cda8346b3d44ca973d66897e2ea41419c3550a20de163bd30c606ac31c297620df3ce47e8b926cf8bd46ee5b1713b4f799f&a=56&b=59][/img]
解决方案四:
该回复于2010-11-24 13:59:27被版主删除