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

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

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

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

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

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

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

  1. //图表标题设置
  2. TextTitlemTextTitle=mBarChart.getTitle();
  3. mTextTitle.setFont(newFont("黑体",Font.BOLD,20));
  4. //图表图例设置
  5. LegendTitlemLegend=mBarChart.getLegend();
  6. if(mLegend!=null)
  7. mLegend.setItemFont(newFont("宋体",Font.CENTER_BASELINE,15));
简洁的方式还可以这样:
  1. //图表标题设置
  2. mBarChart.setTitle(newTextTitle("学校人员分布图",newFont("黑体",Font.BOLD,20)));
  3. //图表图例设置
  4. mBarChart.getLegend().setItemFont(newFont("宋体",Font.CENTER_BASELINE,15));

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

柱状图:

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

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

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

  1. PiePlotmChartPlot=(PiePlot)mChart.getPlot();
  2. LabelFont(newFont("宋体",Font.CENTER_BASELINE,15));
时序图:

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

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

你可能感兴趣的:(jfreechart)