JFreeChart是一組功能強大、靈活易用的Java繪圖API,使用它可以生成多種通用性的報表,包括柱狀圖、餅圖、曲線圖、甘特圖等。它能夠用在Swing和Web等中制作自定義的圖表或報表,並且得到廣泛的應用。但是有的時候會出現方框的情況,下面就來通過例子來說明如何讓中文顯示出來。
要讓一個JFreeChar生成圖形並顯示需要經過下面的步驟:
1、創建DataSet的數據集合
[java]
/**
* 創建一個數據集合
*
* @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圖表
[java]
JFreeChart chart = ChartFactory.createPieChart3D("水果產量圖", // 圖表標題
data, // 數據集
true, // 是否顯示圖例
false, // 是否生成工具
false // 是否生成URL鏈接
);// 創建圖表
3、將圖表顯示出來
[java]
ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1.0f, chart,
800, 450, null);// 輸出圖表
下面是一個在Web頁面上顯示的例子:
[java]
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的配置如下:
[html]
<?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進行訪問的到下面的顯示結果:
從圖表中可以看到,中文不能顯示,都變成瞭一個個的小方框。要解決這個問題需要在代碼中添加下面這樣的設置。
[java]
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);// 為圖例說明設置字體
這是中文顯示效果如下:
此時顯示瞭中文,另外可能你需要顯示每一種情況占用的百分比是多少,這時候可以添加這樣的代碼:
[java]
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} {2}",NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));// 顯示百分比
此時顯示的效果如下:
註意以上添加的代碼需要在輸出圖表之前加上,否則看不到效果的。