JFreeChart生成图表中文乱码问题解决方案

在使用JFreeChart生成图表时,可能会出现中文乱码,下面给出两种解决方法。

1、设置主题样式(推荐方法)

主题样式是在建立图表之前进行设置,JFreeChart图表一般包括3个部分:Title(图表标题)、Plot(图表主体)、Legend(图表图例),主题是统一对这三个部分进行字体设置

  1. //创建主题样式  
  2. StandardChartTheme mChartTheme = new StandardChartTheme("CN");  
  3. //设置标题字体  
  4. mChartTheme.setExtraLargeFont(new Font("黑体", Font.BOLD, 20));  
  5. //设置轴向字体  
  6. mChartTheme.setLargeFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
  7. //设置图例字体  
  8. mChartTheme.setRegularFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
  9. //应用主题样式  
  10. ChartFactory.setChartTheme(mChartTheme);  


实例:

  1. import java.awt.Font;  
  2. import org.jfree.chart.ChartFactory;  
  3. import org.jfree.chart.ChartFrame;  
  4. import org.jfree.chart.JFreeChart;  
  5. import org.jfree.chart.StandardChartTheme;  
  6. import org.jfree.chart.plot.PlotOrientation;  
  7. import org.jfree.data.category.CategoryDataset;  
  8. import org.jfree.data.category.DefaultCategoryDataset;  
  9.   
  10. public class Bar {  
  11.     public static void main(String[] args) {  
  12.         CategoryDataset mDataset = GetDataset();          
  13.           
  14.         //创建主题样式  
  15.         StandardChartTheme mChartTheme = new StandardChartTheme("CN");  
  16.         //设置标题字体  
  17.         mChartTheme.setExtraLargeFont(new Font("黑体", Font.BOLD, 20));  
  18.         //设置轴向字体  
  19.         mChartTheme.setLargeFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
  20.         //设置图例字体  
  21.         mChartTheme.setRegularFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
  22.         //应用主题样式  
  23.         ChartFactory.setChartTheme(mChartTheme);  
  24.         ///////////////以上主题设置必须位于创建图表函数之前才能生效////////////  
  25.         JFreeChart mBarChart = ChartFactory.createBarChart3D(  
  26.                 "学校人员分布图",  //图表标题  
  27.                 "类型",       //横轴(目录轴)标签  
  28.                 "数量",           //纵轴(数值轴)标签  
  29.                 mDataset,       //数据集  
  30.                 PlotOrientation.VERTICAL,   //图表方向  
  31.                 true,           //是否显示图例  
  32.                 true,           //是否生成提示工具  
  33.                 false);         //是否生成url连接  
  34.         ChartFrame mChartFrame = new ChartFrame("学校人员分布图", mBarChart);  
  35.         mChartFrame.pack();  
  36.         mChartFrame.setVisible(true);  
  37.     }  
  38.     public static CategoryDataset GetDataset()  
  39.     {  
  40.         DefaultCategoryDataset mDataset = new DefaultCategoryDataset();       
  41.         mDataset.addValue(2000"清华大学""本科生");  
  42.         mDataset.addValue(1500"清华大学""研究生");  
  43.         mDataset.addValue(1000"清华大学""博士生");  
  44.         mDataset.addValue(900"清华大学""讲师");  
  45.         mDataset.addValue(800"清华大学""副教授");  
  46.         mDataset.addValue(300"清华大学""教授");  
  47.         mDataset.addValue(600"清华大学""行政人员");  
  48.         mDataset.addValue(400"清华大学""管理人员");                
  49.         return mDataset;  
  50.     }  
  51.   
  52. }  

2、对乱码的字体分别进行设置

一般Title和Legend的设置方法比较单一:

  1. //图表标题设置  
  2.         TextTitle mTextTitle = mBarChart.getTitle();  
  3.         mTextTitle.setFont(new Font("黑体", Font.BOLD, 20));  
  4.           
  5.         //图表图例设置  
  6.         LegendTitle mLegend = mBarChart.getLegend();  
  7.         if(mLegend != null)  
  8.             mLegend.setItemFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
  9.           

简洁的方式还可以这样:

  1. //图表标题设置  
  2.         mBarChart.setTitle(new TextTitle("学校人员分布图",new Font("黑体", Font.BOLD, 20)));  
  3.         //图表图例设置  
  4.         mBarChart.getLegend().setItemFont(new Font("宋体", Font.CENTER_BASELINE, 15));  

Plot对应不同的图表,它的设置方法不同。

柱状图:

先取得CategoryPlot的对象,再分别设置x轴和y轴的坐标字体以及标题字体。x轴使用CategoryAxis,y轴使用ValueAxis

  1. //设置柱状图轴  
  2.         CategoryPlot mPlot = (CategoryPlot)mBarChart.getPlot();  
  3.         //x轴  
  4.         CategoryAxis mDomainAxis = mPlot.getDomainAxis();  
  5.         //设置x轴标题的字体  
  6.         mDomainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));  
  7.         //设置x轴坐标字体  
  8.         mDomainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15));  
  9.         //y轴  
  10.         ValueAxis mValueAxis = mPlot.getRangeAxis();  
  11.         //设置y轴标题字体  
  12.         mValueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));  
  13.         //设置y轴坐标字体  
  14.         mValueAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15));  

饼图:

饼图没有x轴和y轴,所以不用设置,需要设置的是饼图上指示比例的标签的字体

  1. PiePlot mChartPlot = (PiePlot)mChart.getPlot();  
  2. LabelFont(new Font("宋体", Font.CENTER_BASELINE, 15));  

时序图:

时序图有x轴和y轴,所以Plot的设置与柱状图基本相同,只是时序图声明的Plot类型为XYPlot,柱状图为CateGoryPlot

  1. //设置柱状图轴  
  2.         XYPlot mPlot = (XYPlot)mTimeChart.getPlot();  
  3.         //x轴  
  4.         ValueAxis mDomainAxis = mPlot.getDomainAxis();  
  5.         //设置x轴标题的字体  
  6.         mDomainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));  
  7.         //设置x轴坐标字体  
  8.         mDomainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15));  
  9.         //y轴  
  10.         ValueAxis mValueAxis = mPlot.getRangeAxis();  
  11.         //设置y轴标题字体  
  12.         mValueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 15));  
  13.         //设置y轴坐标字体  
  14.         mValueAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 15)); 

你可能感兴趣的:(jfreechart)