后来我发现ChartFrame是继承自javax.swing.JFrame的,也就是在JFrame上显示中文有问题。
Class ChartFrame
java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame org.jfree.chart.ChartFrame
后来我想到以前JAVA课程老师说到的改变font字体,于是我编译了如下的代码添加到ChartFactory.createPieChart之前:
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);
另一种极端的方法就是直接改jar包的源代码。比如源码中有setFont(new Font(xxx, Font.PLAIN, 18)); 把xxx改为宋体,我使用的JFreeChart的.jar包为1.0.14,太新的包对中文显示可能有问题,所以最好还是用更早的版本。
于是综合所有办法,采用换包(使用1.0.10)与设置font的方法重新写了一个程序直接将图片生成到本地磁盘。
package org.test.jfreechart;
import java.awt.Font;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.general.DefaultPieDataset;
public class JFreeChartTest3 {
public static DefaultPieDataset getDataset(){
DefaultPieDataset dataset = new DefaultPieDataset();
dpd.setValue("管理人员", 25); //输入数据
dpd.setValue("市场人员", 25);
dpd.setValue("开发人员", 45);
dpd.setValue("其他人员", 10);
JFreeChart jfree = ChartFactory.createPieChart("某公司人员组织数据图",dpt,true,true,false);
ChartFrame cf = new ChartFrame("某公司人员组织数据图",jfree);
cf.pack();
cf.setVisible(true);
}
}
public static void main(String []args){
JFreeChart chart = ChartFactory.createPieChart("某公司人员组织结构图",getDataset(),true,true,true);
Font font = new Font("SimSun",10,20);
chart.getTitle().setFont(font);
LegendTitle legend = chart.getLegend(0);
legend.setItemFont(font);
PiePlot plot = (PiePlot)chart.getPlot();
plot.setLabelFont(font);
try {
OutputStream out = new FileOutputStream("com.jpeg");
try {
ChartUtilities.writeChartAsEG(out,chart,500,400);out.close();
} catch (IOException e) {e.printStackTrace();}
} catch (FileNotFoundException e) {
e.printStackTrace();
}}}
经过修改后,终于解决了乱码,图片显示如下:
图4.14 正确的输出结果
终于,中文显示正常,问题解决。同样将JFreeChart应用到JSP页面中,也能正常显示,无任何问题。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="org.jfree.data.general.DefaultPieDataset" %>
<%@ page import="org.jfree.chart.JFreeChart" %>
<%@ page import="org.jfree.chart.ChartFactory" %>
<%@ page import="org.jfree.chart.servlet.ServletUtilities" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
基于jfreechart的动态数据可视化应用开发(13):http://www.youerw.com/jisuanji/lunwen_823.html