JFreeChart的设计的定制功能是非常灵活的。 我们可以使用非常多的属性来设置我们图表的外观。 本章将详细介绍一些图表通用的定制技术。主要包括下面三个方面
● 图表属性(JFreeChart)
● 图区属性(Plot)
● 轴属性(Axis)
我们可以使用JFreeChart类方法从更高的层次来定制我们图表的外观。 可控制的属性有:
● 图表的边框 (Chart Border)
● 图表的标题和副标题(Chart Title AndSubtitles)
● 图表的背景颜色和图片(Chart Background Color And Image)
● 使用绘制建议(Rendering Hints)画图表,该属性有是否反锯齿功能。
JFreeChart可以在图表的外围画出一个边框。 默认状态下,JFreeChart是不画出边框的,但我们可以使用方法setBorderVisible()
来设置。 边框的颜色和线条风格可使用方法setBorderPaint()
和setBorderStroke()
来控制。
图表有一个标题,显示在图表的顶部、 底部、 左侧或右侧(同时,我们也可以添加副标题,见下章讲述)。 标题使用一个TextTitle的实例对象。 我们可以使用getTitle()方法来获得标题的引用。
TextTitle texttitle = jfreechart.getTitle();
修改标题文本(不修改字体和位置)的代码如下:
texttitle.setText("Pie Chart Demo");
题头放置在图表的顶部、 底部、 左侧或右侧的设置,使用标题本书属性设置来完成。 下面代码显示的是将标题移植到图表的底部。
texttitle.setPosition(RectangleEdge.BOTTOM);
如果在我们图表上,我们不希望显示标题,则将标题设置为null即可
图表可以拥有任何数量的副标题。 添加副标题,需要先创建一个副标题对象(任何Title类的子类),然后将该对象加到图表上即可。 代码如下:
TextTitle subtitle1 = new TextTitle("A Subtitle");
jfreechart.addSubtitle(subtitle1);
我们可以在图表上添加任何数量的副标题,但是紧急我们添加的副标题越多,图表画图的区域就越小。
修改一个已有的副标题,我们需要先获得副标题的一个引用。 代码如下:
Title subtitle = jfreechart.getSubtitle(0);
在我们改变副标题属性之前,我们需要将Title的引用转换成我们需要的适当的子类类型。我们可以使用getSubtitleCount()
方法获得副标题的数量。
我们可以使用setBackgroundPaint()方法设置图表的背景颜色(注意,我们也可以设置我们图区的背景颜色,这与图表的背景颜色不同)。 例如:
jfreechart.setBackgroundPaint(Color.blue);
我们可使用Paint接口的任何实现作为背景颜色的设置参数,其中有Color、GradientPaint(渐变颜色)和TexturePaint等。 代码如下:
Paint p = new GradientPaint(0, 0, Color.white, 1000, 0, Color.green);
jfreechart.setBackgroundPaint(p);
我们可以设置我们的背景颜色为null,这时推荐使用一个背景图片来设置我们的图表。
我们可以使用方法setBackgroundImage()来为我们的图表设置一幅背景图表。
jfreechart.setBackgroundImage(JFreeChart.INFO.getLogo());
默认的,图片充满图表的整个背景,图片失真。 但我们可以使用setBackgroundImageAlignment()
方法来改变图片不充满整个背景。 代码如下:
jfreechart.setBackgroundImageAlignment(Align.TOP_LEFT);
使用setBackgroundImageAlpha()
方法,我们可以控制图片的透明度。 如果我们希望图片只
填充我们图表的区域(区域包含轴),那么我们需要将背景图片添加到图表的图区。 代码如
下(以饼图为例):
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setBackgroundImage(JFreeChart.INFO.getLogo())
JFreeChart使用java2D的API来画图表。 在java2D中的API中,我们可以提供绘制建议让绘制引擎绘制图表。 JFreeChart允许我们在画图表时,使用setRenderingHints()方法,将绘制建议参数传入java2D的API中。
JFreeChart还提供了一个便利反锯齿开关方法。 当反锯齿开关开时,图表会绘制出比较光滑的图表,但是花费的时间要长。 代码如下:
jfreechart.setAntiAlias(true);//JFreeChart画图时,默认为反锯齿开关为开.
JFreeChart类在绘制图表时,将大部分工作交给了Plot类(图形绘制结构)或Plot的子类。JFreeChart类的getPlot()方法返回了一个图表创建的图区(plot)的引用:Plot plot = jfreechart.getPlot();
.
我们需要将该引用转化成Plot的一个具体子类。 例如:
CategoryPlot plot = jfreechart.getCategoryPlot();
或XYPlot plot = jfreechart.getXYPlot();
注意:如果plot类型不匹配,则在转化的时候,会抛出ClassCastException类型转制异常。
那么我们如何知道我们图表使用的Plot是那个子类呢?作为使用JFreeChart的经验,分清那些图表使用CategoryPlot和那些图表使用XYPlot是非常清晰的。 如果还怀疑,看一下ChartFactory类的源代码就会明白每个类型的图表是如何放在一起的。
我们可以使用方法setBackgroundPaint()设置图区的背景颜色。 例如:
Plot plot = jfreechart.getPlot();
plot.setBackgroundPaint(Color.white);
我们可使用Paint接口的任何实现作为背景颜色的设置参数,其中有Color、GradientPaint(渐变颜色)和TexturePaint等。 同时,我们也可以设置背景颜色为null。
我们可以使用方法setBackgroundImage()
为图区设置备有图片。
Plot plot = jfreechart.getPlot();
plot.setBackgroundImage(JFreeChart.INFO.getLogo());
默认的,图片充满图表的整个背景,图片失真。 但我们可以改变图片不充满整个背景,使用方法是setBackgroundImageAlignment():
plot.setBackgroundImageAlignment(Align.BOTTOM_RIGHT);
使用setBackgroundImageAlpha()方法,我们可以控制图片的透明度。 如果我们希望图片充满这个图表区域,那么我们需要将背景图片添加到JFreeChart对象上,这里应该注意与图表背景图片
区分开来.
使用JFreeChart创建的大部分图表都带有两个轴。 X轴和Y轴。 当然对于一些图表(比如饼图)根本就没有轴。 对于使用轴的图表来说,图区使用Axis对象来管理轴。
CategoryPlot和XYPlot类getDomainAxis()和getRangeAxis()分别是获得X轴Y轴对象,注意CategoryPlot下getDomainAxis获取的是CategoryAxis对象,其他的情况都是返回是ValueAxis对象的引用.样例代码如下:
// get an axis reference...
CategoryPlot plot = jfreechart.getCategoryPlot();
CategoryAxis domainAxis = plot.getDomainAxis();
// change axis properties...
domainAxis.setLabel("Categories");
domainAxis.setLabelFont(someFont);
CategoryAxis和ValueAxis类有许多不同的子类。 有时我们需要将轴对象引用转化成具体的子类,为了获取更多具体的属性。 如,如果我们想获得y轴为一个对象NumberAxis。 代码如下:
XYPlot plot = jfreechart.getXYPlot();
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setAutoRange(false);
我们使用方法setLabel()可以改变轴的标签。 如果我们不想在图表的轴上有标签,那么我们就设置为null即可。
我们可以使用Axis类定义的方法setLabelFont(), setLabelPaint(), 和 setLabelInsets()改变标签的字体、 颜色等内容。
当图区在左侧或右侧画一个轴(水平轴)时,轴标签会自动旋转90度,以满足小空间的需要。 如果我们希望标签也水平,我们需要修改标签的角度:
XYPlot plot = jfreechart.getXYPlot();
ValueAxis axis = plot.getRangeAxis();
axis.setLabelAngle(Math.PI / 2.0);
注意角度的表示使用弧度(PI为180度)。
隐藏某个轴的刻度标签:
CategoryPlot plot = jfreechart.getCategoryPlot();
ValueAxis axis = plot.getRangeAxis();
axis.setTickLabelsVisible(false);
对于CategoryAxis,方法setTickLabelsVisible(false)隐藏种类标签。
隐藏某个轴的刻度符号:
XYPlot plot = jfreechart.getXYPlot();
Axis axis = plot.getDomainAxis();
axis.setTickMarksVisible(false);
注意category轴没有刻度符号。
默认的,数值和日期会自动选择一个刻度尺寸,以便刻度标签不会重复显示。 但我们也可以使用setTickUnit()方法设置我们自己的饿刻度单位。
在NumberAxis类中,方法允许我们设置我们自己的刻度单位替代系统自动选择刻度单位的机制。 最普通的应用就是我们有一个仅仅显示整数的数轴。 在实例中,我们不想让0.5或者0.25作为刻度单位。 在NumberAxis类中有一个静态方法返回一系列的标准整数刻度单位:
XYPlot plot = jfreechart.getXYPlot();
NumberAxis axis = (NumberAxis) plot.getRangeAxis();
TickUnitSource units = NumberAxis.createIntegerTickUnits();
axis.setStandardTickUnits(units);
如果我们想控制标准的刻度单位时,我们可以自由定制自己的TickUnits集合。
类似于指定标准的数值刻度单位
,DateAxis类也有一个setStandardTickUnits()方法,来设置我们的刻度单位。 方法createStandardDateTickUnits()为DateAxis返回了一个缺省的集合。 同时我们
也可以创建我们自己的标准日期刻度单位。
XYPlot plot = (XYPlot) chart.getPlot();
plot.setDomainPannable(true);
plot.setRangePannable(true);