2008年3月25日星期二

JFreeChart 渐变色的设置

最近同事写代码的时候发现 JFreechart 柱图设置渐变色的时候,水平方向的柱图无论怎么设点都不管用,查看 JFreechart 源码后发现一些问题.

默认的情况下,jfreechart是纵向渐变。JFreeChart 的渐变利用的是 GradientPaint 类,这是java的标准类。它的参数为(x1,y1,color1,x2,y2,color2),颜色是从x1,y1的点向x2,y2的点进行颜色渐变。但用在jfreechart中无论你如何设置这两点都没有作用。原因是它在内部重新定义GradientPaint对象。颜色是用我们定义的颜色,点是由它自己设置(也就是说不用我们自己设点?)。原因很简单,就是我们传递GradientPaint对象给renderer时,并不知道它的柱子会画多高(如果是水平就是多宽),所以它在画柱子时,会把柱子的开始点与高度重新传给新的GradientPaint对象。
jfreechart中控制渐变的横向与纵向的开关就是StandardGradientPaintTransformer对象,在new这个对象时,有一个带参的构造函数,可以把纵向或横向传递进去,如下代码所示:

//首先要得到BarRenderer 对象,如果使用的是CategoryItemRenderer,那需要进行转换了。因为下面的方法只有BarRender才有。
BarRenderer renderer = (BarRenderer)chart.getCategoryPlot().getRenderer();

if (!vertical) {
StandardGradientPaintTransformer transformer = new StandardGradientPaintTransformer(GradientPaintTransformType.HORIZONTAL);
renderer.setGradientPaintTransformer(transformer);
}

if (vertical) {

renderer.setSeriesPaint(0, new GradientPaint(0.0F, 0.0F, Color.blue, 0.0F, 0.0F, Color.lightGray));
}
else {
renderer.setSeriesPaint(0, new GradientPaint(0.0F, 0.0F, Color.lightGray, (float)width, (float)height, Color.blue));
}

没有评论: