前段时间,项目组有个业务需求,需要生成财务分析图表,开始采用的是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);
}
没有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);
}
http://b59.photo.store.qq.com/http_imgload.cgi?/rurl4_b=9221724b03a323e0508bad38d8344c18beddbf16a355ebdcaaefac411f82d48023979cda8346b3d44ca973d66897e2ea41419c3550a20de163bd30c606ac31c297620df3ce47e8b926cf8bd46ee5b1713b4f799f&a=56&b=59