在使用JFreeChart生成图表时,可能会出现中文乱码,下面给出两种解决方法。
1、设置主题样式(推荐方法)
主题样式是在建立图表之前进行设置,JFreeChart图表一般包括3个部分:Title(图表标题)、Plot(图表主体)、Legend(图表图例),主题是统一对这三个部分进行字体设置
//创建主题样式 StandardChartTheme mChartTheme = new StandardChartTheme("CN"); //设置标题字体 mChartTheme.setExtraLargeFont(new Font("黑体", Font.BOLD, 20)); //设置轴向字体 mChartTheme.setLargeFont(new Font("宋体", Font.CENTER_BASELINE, 15)); //设置图例字体 mChartTheme.setRegularFont(new Font("宋体", Font.CENTER_BASELINE, 15)); //应用主题样式 ChartFactory.setChartTheme(mChartTheme);
import java.awt.Font; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.chart.StandardChartTheme; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; public class Bar { public static void main(String[] args) { CategoryDataset mDataset = GetDataset(); //创建主题样式 StandardChartTheme mChartTheme = new StandardChartTheme("CN"); //设置标题字体 mChartTheme.setExtraLargeFont(new Font("黑体", Font.BOLD, 20)); //设置轴向字体 mChartTheme.setLargeFont(new Font("宋体", Font.CENTER_BASELINE, 15)); //设置图例字体 mChartTheme.setRegularFont(new Font("宋体", Font.CENTER_BASELINE, 15)); //应用主题样式 ChartFactory.setChartTheme(mChartTheme); ///////////////以上主题设置必须位于创建图表函数之前才能生效//////////// JFreeChart mBarChart = ChartFactory.createBarChart3D( "学校人员分布图", //图表标题 "类型", //横轴(目录轴)标签 "数量", //纵轴(数值轴)标签 mDataset, //数据集 PlotOrientation.VERTICAL, //图表方向 true, //是否显示图例 true, //是否生成提示工具 false); //是否生成url连接 ChartFrame mChartFrame = new ChartFrame("学校人员分布图", mBarChart); mChartFrame.pack(); mChartFrame.setVisible(true); } public static CategoryDataset GetDataset() { DefaultCategoryDataset mDataset = new DefaultCategoryDataset(); mDataset.addValue(2000, "清华大学", "本科生"); mDataset.addValue(1500, "清华大学", "研究生"); mDataset.addValue(1000, "清华大学", "博士生"); mDataset.addValue(900, "清华大学", "讲师"); mDataset.addValue(800, "清华大学", "副教授"); mDataset.addValue(300, "清华大学", "教授"); mDataset.addValue(600, "清华大学", "行政人员"); mDataset.addValue(400, "清华大学", "管理人员"); return mDataset; } }2、对乱码的字体分别进行设置
一般Title和Legend的设置方法比较单一:
//图表标题设置 TextTitle mTextTitle = mBarChart.getTitle(); mTextTitle.setFont(new Font("黑体", Font.BOLD, 20)); //图表图例设置 LegendTitle mLegend = mBarChart.getLegend(); if(mLegend != null) mLegend.setItemFont(new Font("宋体", Font.CENTER_BASELINE, 15));简洁的方式还可以这样:
//图表标题设置 mBarChart.setTitle(new TextTitle("学校人员分布图",new Font("黑体", Font.BOLD, 20))); //图表图例设置 mBarChart.getLegend().setItemFont(new Font("宋体", Font.CENTER_BASELINE, 15));
Plot对应不同的图表,它的设置方法不同。
柱状图:
先取得CategoryPlot的对象,再分别设置x轴和y轴的坐标字体以及标题字体。x轴使用CategoryAxis,y轴使用ValueAxis
//设置柱状图轴 CategoryPlot mPlot = (CategoryPlot)mBarChart.getPlot(); //x轴 CategoryAxis mDomainAxis = mPlot.getDomainAxis(); //设置x轴标题的字体 mDomainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15)); //设置x轴坐标字体 mDomainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15)); //y轴 ValueAxis mValueAxis = mPlot.getRangeAxis(); //设置y轴标题字体 mValueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15)); //设置y轴坐标字体 mValueAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15));饼图:
饼图没有x轴和y轴,所以不用设置,需要设置的是饼图上指示比例的标签的字体
PiePlot mChartPlot = (PiePlot)mChart.getPlot(); mChartPlot.setLabelFont(new Font("宋体", Font.CENTER_BASELINE, 15));时序图:
时序图有x轴和y轴,所以Plot的设置与柱状图基本相同,只是时序图声明的Plot类型为XYPlot,柱状图为CateGoryPlot
//设置柱状图轴 XYPlot mPlot = (XYPlot)mTimeChart.getPlot(); //x轴 ValueAxis mDomainAxis = mPlot.getDomainAxis(); //设置x轴标题的字体 mDomainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15)); //设置x轴坐标字体 mDomainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15)); //y轴 ValueAxis mValueAxis = mPlot.getRangeAxis(); //设置y轴标题字体 mValueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15)); //设置y轴坐标字体 mValueAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15));