由于JFreeChart组件的版本、操作平台、JDK 的设置等因素,在使用 JFreeChart 组件时可能会出现中文乱码的现象。遇到此问题时,可通过设置文字的字体来解决问题。在此提供以下两种解决此问题的方法。
一、设置主题的样式(强烈推荐)
在创建统计图表之前,创建主题样式并指定样式中的字体,通过 ChartFactory 类的 setChartTheme() 方法设置主题样式,这种方式在目前已知的所有版本的 JFreeChart 中均可使用,效果相当不错,我找了好久才找到,而且我觉得这应该是解决中文字体显示为方块的比较标准的方法之壹。
//创建主题样式 StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); //设置标题字体 standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20)); //设置图例的字体 standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 15)); //设置轴向的字体 standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 15)); //应用主题样式 ChartFactory.setChartTheme(standardChartTheme); //生成统计图 JFreeChart chart=ChartFactory.createBarChart3D("水果产量图", "水果", "水果", dataset, PlotOrientation.VERTICAL, true, true, true);
二、指定乱码文字的字体(仅对旧版本有效)
使用JFreeChart绘制图表的时候,如果使用默认的字体,通常会导致图标中的汉字显示为乱码。解决方法如下:JFreeChart 是用户使用该库提供的各类图标的统一接口,而它主要由三个部分构成:Title(标题),Legend(图例),Plot(图表主体)。因此对乱码文字的处理转化为分别对这三个部分的字体进行处理,设置方法分别如下:
1、设置 Title 的字体,直接获取 Title 的内容并设置其字体为中文字体的某种格式即可。
TextTitle textTitle = freeChart.getTitle(); textTitle.setFont(new Font("宋体", Font.BOLD, 20));2、设置 Legend 的字体,直接获取其引用并设置字体样式。
LegendTitle legend = freeChart.getLegend(); if (legend != null) { legend.setItemFont(new Font("宋体", Font.BOLD, 20)); }
3、设置 Plot 的字体,先获取 Plot 的 X 轴和 Y 轴对象的引用,然后分别设置其字体样式。对于不同类型的图表对应 Plot 的不同的实现类,设置字体的方法也不完全相同。以下以柱状图的设置为例进行说明:
CategoryPlot plot = (CategoryPlot)freeChart.getPlot(); //获取柱状图的 X 轴 CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴坐标上的字体 domainAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴上的标题的字体 //获取柱状图的 Y 轴 ValueAxis valueAxis = plot.getRangeAxis(); valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的字体 valueAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的标题的字体
另外特别要提出来的是,网上有很多关于设置 Plot 的 X 轴与 Y 轴字体的文章,用的就是上面的方法,但是很遗憾,我在尝试的过程中发现这個方法并不奏效,如果强行使用下面的方法,要么就是无法在 API 中找到对应的方法名称,要么就是在获取 Plot 引用的时候提示 ClassCastException(更具体的原因是 XYPlot 类型无法转化为 CategoryPlot 类型),因为我使用的是当前 JFreeChart 的最新版本1.0.15,所以我初步分析是 JFreeChart 的开发人员在最新版的开发包中将这几個方法的声明去掉了,在旧版本的 JFreeChart 中以上方法也许是可行的,不过我没有测试过,如果有谁用过 JFreeChart 比较早期的版本,可以在本文下方留言,共同讨论提高。
对于使用PiePlot的图标,如饼状图,通常按照如下方式进行设置:
PiePlot plot = (PiePlot)freeChart.getPlot(); plot.setLabelFont(new Font("宋体", Font.BOLD, 15));