因为JFreeChart组件的版本、操做平台、JDK 的设置等因素,在使用 JFreeChart 组件时可能会出现中文乱码的现象。遇到此问题时,可经过设置文字的字体来解决问题。在此提供如下两种解决此问题的方法。 java
1、设置主题的样式(强烈推荐) dom
在建立统计图表以前,建立主题样式并指定样式中的字体,经过 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);
2、指定乱码文字的字体(仅对旧版本有效) 字体
使用JFreeChart绘制图表的时候,若是使用默认的字体,一般会致使图标中的汉字显示为乱码。解决方法以下:JFreeChart 是用户使用该库提供的各种图标的统一接口,而它主要由三个部分构成:Title(标题),Legend(图例),Plot(图表主体)。所以对乱码文字的处理转化为分别对这三个部分的字体进行处理,设置方法分别以下: spa
一、设置 Title 的字体,直接获取 Title 的内容并设置其字体为中文字体的某种格式便可。 code
TextTitle textTitle = freeChart.getTitle(); textTitle.setFont(new Font("宋体", Font.BOLD, 20));二、设置 Legend 的字体,直接获取其引用并设置字体样式。
LegendTitle legend = freeChart.getLegend(); if (legend != null) { legend.setItemFont(new Font("宋体", Font.BOLD, 20)); }
三、设置 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));