JFreeChart的簡單應用以及解決中文顯示方框的問題 – JAVA編程語言程序開發技術文章

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%")));// 顯示百分比 
此時顯示的效果如下:

註意以上添加的代碼需要在輸出圖表之前加上,否則看不到效果的。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *