如果使用JfreeChart默认的声明方式创建出来的图表图片上中文标题是方框或乱码,这个不用说肯定和字体有关.接下来来看一下解决办法.
打开doc文件里的TextTitle类你会发现
/**
The default font.
*/
public static final Font DEFAULT_FONT = new Font( " SansSerif " , Font.BOLD, 12 );
public static final Font DEFAULT_FONT = new Font( " SansSerif " , Font.BOLD, 12 );
JFreeChart里最后将你创建的实例传给了另一个类的方法:currentTheme.apply(chart);
找到theme的顶级类StandardChartTheme你会发现这个apply()方法,
public
void
apply(JFreeChart chart) {
if (chart == null ) {
throw new IllegalArgumentException( " Null 'chart' argument. " );
}
TextTitle title = chart.getTitle();
if (title != null ) {
title.setFont( this .extraLargeFont); // ------------在这里它将标题的字体设置成了事先定义好的字体,如下两段代码;
title.setPaint( this .titlePaint);
}
if (chart == null ) {
throw new IllegalArgumentException( " Null 'chart' argument. " );
}
TextTitle title = chart.getTitle();
if (title != null ) {
title.setFont( this .extraLargeFont); // ------------在这里它将标题的字体设置成了事先定义好的字体,如下两段代码;
title.setPaint( this .titlePaint);
}
123
private
Font extraLargeFont;
294
public
StandardChartTheme(String name) {
295 if (name == null ) {
296 throw new IllegalArgumentException( " Null 'name' argument. " );
297 }
298 this .name = name;
299 this .extraLargeFont = new Font( " Tahoma " , Font.BOLD, 20 ); // 在构造函数里将此字体设置成了"Tahoma"
295 if (name == null ) {
296 throw new IllegalArgumentException( " Null 'name' argument. " );
297 }
298 this .name = name;
299 this .extraLargeFont = new Font( " Tahoma " , Font.BOLD, 20 ); // 在构造函数里将此字体设置成了"Tahoma"
现在我们已经很清楚不能正确显示中文的原因了,如何来解决呢?
很简单:
JFreeChart chart
=
ChartFactory.createPieChart(titleString,pieDataset,
true
,
true
,
false
);
chart.getTitle().setFont( new Font( " 宋体 " , Font.BOLD, 12 ));
chart.getTitle().setFont( new Font( " 宋体 " , Font.BOLD, 12 ));
我们只要重新设置TextTitle的字体就行了.
不过这种方法只适用于中文操作系统,因为已经有中文字体了.要想在非中文系统上用怕是要在程序中带上一个中文字体库,然后再调用该字库.