JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。但是有的时候会出现方框的情况,下面就来通过例子来说明如何让中文显示出来。
要让一个JFreeChar生成图形并显示需要经过下面的步骤:
1、创建DataSet的数据集合
/** * 创建一个数据集合 * * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("苹果", 100); dataset.setValue("梨子", 200); dataset.setValue("葡萄", 300); dataset.setValue("香蕉", 400); dataset.setValue("荔枝", 500); return dataset; }
2、通过ChartFactory创建JFreeChart图表
JFreeChart chart = ChartFactory.createPieChart3D("水果产量图", // 图表标题 data, // 数据集 true, // 是否显示图例 false, // 是否生成工具 false // 是否生成URL链接 );// 创建图表
3、将图表显示出来
ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1.0f, chart, 800, 450, null);// 输出图表
下面是一个在Web页面上显示的例子:
package org.ml.servlet; import java.awt.Font; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; 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.chart.title.TextTitle; import org.jfree.data.general.DefaultPieDataset; public class ChartDemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ChartDemoServlet() { super(); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("image/jpeg");// 将输出设置为image/jepg格式 DefaultPieDataset data = getDataSet();// 创建数据集合容器 JFreeChart chart = ChartFactory.createPieChart3D("水果产量图", // 图表标题 data, // 数据集 true, // 是否显示图例 false, // 是否生成工具 false // 是否生成URL链接 );// 创建图表 ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1.0f, chart, 800, 450, null);// 输出图表 } /** * 创建一个数据集合 * * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("苹果", 100); dataset.setValue("梨子", 200); dataset.setValue("葡萄", 300); dataset.setValue("香蕉", 400); dataset.setValue("荔枝", 500); return dataset; } }
Web.xml中对Servlet的配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>ChartDemoServlet</servlet-name> <servlet-class>org.ml.servlet.ChartDemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ChartDemoServlet</servlet-name> <url-pattern>/servlet/ChartDemoServlet</url-pattern> </servlet-mapping> </web-app>在浏览器地址栏中输入:http://localhost:10086/JFreeChart/servlet/ChartDemoServlet进行访问的到下面的显示结果:
从图表中可以看到,中文不能显示,都变成了一个个的小方框。要解决这个问题需要在代码中添加下面这样的设置。
Font titleFont = new Font("黑体", Font.BOLD, 20); TextTitle textTitle = chart.getTitle(); textTitle.setFont(titleFont);// 为标题设置上字体 Font plotFont = new Font("宋体", Font.PLAIN, 16); PiePlot plot = (PiePlot) chart.getPlot(); plot.setLabelFont(plotFont); // 为饼图元素设置上字体 Font LegendFont = new Font("楷体", Font.PLAIN, 18); LegendTitle legend = chart.getLegend(0); legend.setItemFont(LegendFont);// 为图例说明设置字体这是中文显示效果如下:
此时显示了中文,另外可能你需要显示每一种情况占用的百分比是多少,这时候可以添加这样的代码:
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} {2}",NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));// 显示百分比此时显示的效果如下:
注意以上添加的代码需要在输出图表之前加上,否则看不到效果的。