刚接触JFreeChart这个图形报表工具包,写了一个JAVA应用程序,打算利用JFreeChart强大的图形生成功能生成一个简单的饼图,发现JAVA图形界面上却无法正常显示中文,中文显示的都是一个一个的小方框。
package org.test.jfreechart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class JFreeChartTest {
/**
* @param args
*/
public static void main(String[] args) {
DefaultPieDataset dpt = new DefaultPieDataset();
dpt.setValue("教务处", 25);
dpt.setValue("党工部",50);
dpt.setValue("学工部", 200);
dpt.setValue("后勤管理部", 300);
dpt.setValue("基组建设", 40);
dpt.setValue("指标监督", 10);
JFreeChart jfree = ChartFactory.createPieChart("某公司人员组织结构图",dpt,true,true,false);
ChartFrame cf = new ChartFrame("某学校人员组织结构图",jfree);
cf.pack();
cf.setVisible(true);
}
}
显示效果如下:
除了标题的中文能正常显示以外,其它的都显示为方格。奇怪的是为什么标题跟链接的中文都能正常显示,为什么用到ChartFrame上就不能正常显示了呢?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在网上查了下有些用swing比较熟练的朋友的解决办法,就是改变font字体:
Font ft = new Font("SimSun", 10, 10);
CategoryPlot categoryplot = null;
TextTitle txtTitle = null;
LegendTitle legend = null;
txtTitle = jfreechart.getTitle();
legend = jfreechart.getLegend();
categoryplot = (CategoryPlot) jfreechart.getPlot();
txtTitle.setFont(ft);
另一种极端的方法就是直接改jar包的源代码。
比如源码中有
setFont(new Font(xxx, Font.PLAIN, 18));
把xxx改为宋体
我使用的JFreeChart的.jar包为1.0.13有网友说这个版本的jar包对中文显示有问题,建议用更早的版本。
于是综合所有办法,采用换包(使用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();
dataset.setValue("人事部", 13);
dataset.setValue("研发部", 100);
dataset.setValue("后勤部", 12);
dataset.setValue("市场部", 50);
return dataset;
}
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.writeChartAsJPEG(out,chart,500,400);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
图片显示如下:
一切中文显示正常。
问题解决。同样将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>
<title>My JSP 'jfreechart.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("人事部", 13);
dataset.setValue("研发部", 100);
dataset.setValue("后勤部", 12);
dataset.setValue("市场部", 50);
JFreeChart chart = ChartFactory.createPieChart3D("某公司人员组织结构图",dataset,true,true,true);
String fileName = ServletUtilities.saveChartAsPNG(chart,500,400,session);
String url = request.getContextPath()+"/DisplayChart?filename="+fileName;
%>
<img src="<%=url %>" width="500" height="400">
</body>
</html>
希望各位朋友不要遇到相同的问题,解决办法:
1。试用对中文支持好的JAR包。
2。设置FONT。
3。改源代码。(不建议使用)