前段时间,项目组有个业务需求,需要生成财务分析图表,开始采用的是FushionChart,因为这个简单,效果好看,功能也够强大,上线后不久,遇到了一个问题,就是用户需要将图表打印出来,没有彩色打印机,只有黑白打印机,所以光靠颜色来区分就很困难了。业务需求的老大对Excel挺熟的,他在Excel中画的图表是可以使用纹理填充的,黑白打印效果完全没问题。    
    没有FunshionChart的源码,没办法改人家的东西,于是就找来了JFreeChart,可是这家伙好像也不支持使用纹理填充,网上搜了N久也没有现成的,倒是有和我们一样需求的人在问。没办法,只能自己先研究看看了,通过几天的百度,对JFreeChart有了大概的了解,知道了TexturePaint可以用来填充纹理,知道了BarRenderer可以对柱状图表进行修饰,通过代码跟踪,测试,终于试验成功了。
    主要代码如下,供有需要的人参考:
    
 private static JFreeChart createChart(CategoryDataset dataset) {        // create the chart...
        JFreeChart chart = ChartFactory.createStackedBarChart(
            "Bar Chart Demo 1",       // chart title
            "Category",               // domain axis label
            "Value",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // orientation
            true,                     // include legend
            true,                     // tooltips?
            false                     // URLs?
        );
        chart.setBackgroundPaint(Color.white);
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(true);
        renderer.setBarPainter(new TextureBarPainter());//这个是我自己实现的BarPainter
        renderer.setSeriesPaint(0, getTexturePaint("1.png"));//.png是相应的纹理图片
        renderer.setSeriesPaint(1, getTexturePaint("2.png"));
        renderer.setSeriesPaint(2, getTexturePaint("3.png"));
        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(
                CategoryLabelPositions.createUpRotationLabelPositions(
                        Math.PI / 6.0));
        return chart;    }
    
    private static TexturePaint getTexturePaint(String textureFile){
     BufferedImage bi=null;
        Rectangle r = null;
        TexturePaint tp = null;
try {
File in = new File("D:\\texture\\"+textureFile);
bi = ImageIO.read(in);
} catch (IOException e) {
e.printStackTrace();
}
r = new Rectangle(0,0,bi.getWidth(),bi.getHeight());
tp = new TexturePaint(bi,r);
return tp;
    }//----------------------
//TextureBarPainter主要代码
 public void paintBar(Graphics2D g2, BarRenderer renderer, int row,
            int column, RectangularShape bar, RectangleEdge base) {        Paint itemPaint = renderer.getItemPaint(row, column);
        g2.setPaint(itemPaint);
        g2.fill(bar);
 }