`

JFreeChart新版本乱码内幕

阅读更多
软件版本问题,jfreechart-1.0.10有人说没有问题,但jfreechart-1.0.11到13都有问题,我用的最新的jfreechart-1.0.13不做设置是有问题的。
究其原因,是它代码的内部设置的字体有问题.
先来跟踪一下它的代码:

JFreeChart chart = ChartFactory.createBarChart(
   "数据统计图",
   "设备号",
   "积累值",
   dataset,
   PlotOrientation.VERTICAL,
   true, true, false
   );
它的原型
public static JFreeChart createBarChart(String title,
                                            String categoryAxisLabel,
                                            String valueAxisLabel,
                                            CategoryDataset dataset,
                                            PlotOrientation orientation,
                                            boolean legend,
                                            boolean tooltips,
                                            boolean urls) {
上面的原型又调用了
   JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
                plot, legend);
currentTheme.apply(chart);
看看缺省字体的定义: 
public static final Font DEFAULT_TITLE_FONT
            = new Font("SansSerif", Font.BOLD, 18);
看看当前主题currentTheme是什么
private static ChartTheme currentTheme = new StandardChartTheme("JFree");
看它的原型定义
public StandardChartTheme(String name) {
        if (name == null) {
            throw new IllegalArgumentException("Null 'name' argument.");
        }
        this.name = name;
        this.extraLargeFont = new Font("Tahoma", Font.BOLD, 20);
        this.largeFont = new Font("Tahoma", Font.BOLD, 14);
        this.regularFont = new Font("Tahoma", Font.PLAIN, 12);
        this.smallFont = new Font("Tahoma", Font.PLAIN, 10);
……
看到了吧,默认的标题字体是SansSerif,在很多中文系统中是没有这种字体的,这可能是用老外开发开源产品的弊端吧。
首先说标题的乱码吧:
public JFreeChart(String title, Font titleFont, Plot plot,
                      boolean createLegend) {
……
对标题设置的代码:
if (title != null) {
            if (titleFont == null) {
                titleFont = DEFAULT_TITLE_FONT;
            }
            this.title = new TextTitle(title, titleFont);
            this.title.addChangeListener(this);
        }
它使用了默认字体,因此要解决这个问题只要,对标题重新设置字体就可以了。
……
TextTitle textTitle = chart.getTitle();
       textTitle.setFont(new Font("黑体", Font.PLAIN, 20));    
图例和其它乱码一样处理,更换字体。
CategoryPlot plot = chart.getCategoryPlot();//获得图表区域对象
    CategoryAxis domainAxis = plot.getDomainAxis();
       domainAxis.setVisible(true);
       plot.setDomainAxis(domainAxis);
ValueAxis rAxis = plot.getRangeAxis();
/*------设置X轴坐标上的文字-----------*/
       domainAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));
       /*------设置X轴的标题文字------------*/
       domainAxis.setLabelFont(new Font("宋体",Font.PLAIN,15));         
       /*------设置Y轴坐标上的文字-----------*/
       rAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));
       /*------设置Y轴的标题文字------------*/
       rAxis.setLabelFont(new Font("黑体",Font.PLAIN,15)); 

这里需要注意的是,哪里出现了乱码就修改哪里的字体,将字体转换为系统有的就可以了.



上 边 是 柱 状 图 , 以 下 为 饼 图

//定义字体格式   
         Font font = new Font("微软雅黑", Font.CENTER_BASELINE, 12);    
        //定义图片标题    
         TextTitle title = new TextTitle("Pie状图");    
        //设置标题的格式    
         title.setFont(font);    
        //把标题设置到图片里面    
        jfreechart.setTitle(title);    
            
        //设置字体,非常关键不然会出现乱码的,下方的字体    
        jfreechart.getLegend().setItemFont(font);    
        //Pie图的字体    
        piePlot.setLabelFont(font); 


 1. CategoryAxis domainAxis = plot.getDomainAxis();     
 2.   
 3. // NumberAxis  valueAxis=(NumberAxis) plot.getRangeAxis();    
 4. //有人说这个是水平方向设置的 方法。   
 5. ValueAxis numberaxis = plot.getRangeAxis();   
 6.      
 7. /*------设置X轴坐标上的文字-----------*/     
 8. domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));      
 9.      
10. /*------设置X轴的标题文字------------*/     
11. domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));      
12.      
13. /*------设置Y轴坐标上的文字-----------*/     
14. numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));      
15.      
16. /*------设置Y轴的标题文字------------*/     
17. numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));      
18.      
19. /*------这句代码解决了底部汉字乱码的问题-----------*/     
20. jfreechart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics