JFreeChart學習筆記
JFreeChart
JFreeChart中幾個核心的對象類:
類名 |
類的作用以及簡單描述 |
JFreeChart |
圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定製。JFreeChart引擎本身提供了一個工廠類用於創建不同類型的圖表對象 |
XXXXXDataset |
數據集對象,用於提供顯示圖表所用的數據。根據不同類型的圖表對應着很多類型的數據集對象類。常用的數據集對象有:柱狀圖數據集對象DefaultCategoryDataset、餅圖數據集對象DefauldPieDataset和曲線圖數據集對象DefaultTableXYDataset |
XXXXXPlot |
圖表區域對象,基本上這個對象決定着什麼樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持。常用的Plot對象有:柱狀圖CategoryPlot、餅圖PiePlot和曲線圖XYPlot。 |
XXXXXAxis |
用於處理圖表的兩個軸:縱軸和橫軸。常用的有NumberAxis數據軸,DateAxis日期軸。 |
XXXXXRenderer |
負責如何顯示一個圖表對象。常用的Renderer有DefaultCategoryItemRenderer 柱狀圖顯示器StandardXYItemRenderer曲線圖顯示器。餅圖的Renderer |
XXXXXURLGenerator |
用於生成Web圖表中每個項目的鼠標點擊鏈接。常用的URLCenerator有StandardCategoryURLGenerator StandardPieURLGenerator StandardXYURLGenerator |
XXXXXToolTipGenerator |
用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類。常用的有:StandardXYToolTipGenerator StandardCategoryToolTipGenerator StandardPieItemLabelGenerator |
一般的創建圖表的過程爲:
1. 從數據庫裏讀取數據
2. 將數據保存到圖表對應的數據集對象中
3. 創建座標軸對象
4. 創建Renderer對象
5. 創建Plot對象
6. 創建JfreeChart對象
7. 生成圖片文件(或者二進制流)
以JfreeChart提供的Web應用的例子來說明一下以上幾個步驟:
一.柱圖。
public static String generateBarChart(Date hitDate, HttpSession session, PrintWriter pw) {
String filename = null;
try {
// Retrieve list of WebHits
WebHitDataSet whDataSet = new WebHitDataSet();
ArrayList list = whDataSet.getDataBySection(hitDate);//獲得數據集// Throw a custom NoDataException if there is no data
if (list.size() == 0) {
System.out.println("No data has been found");
throw new NoDataException();
}
// Create and populate a CategoryDataset
Iterator iter = list.listIterator();
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
while (iter.hasNext()) {
WebHit wh = (WebHit)iter.next();
dataset.addValue(new Long(wh.getHitCount()), "Hits", wh.getSection());
}//將數據集保存到Dataset對象// Create the chart object
CategoryAxis categoryAxis = new CategoryAxis("");
ValueAxis valueAxis = new NumberAxis("");//創建座標軸
BarRenderer renderer = new BarRenderer();//創建Renderer
renderer.setItemURLGenerator(new StandardCategoryURLGenerator("xy_chart.jsp","series","section"));//創建URLGenerator.再不需要連接的情況下將第一個參數設置成"###"就可以了
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());//創建提示標籤
Plot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);//創建圖表區域對象
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
chart.setBackgroundPaint(java.awt.Color.white);//創建圖表
// Write the chart image to the temporary directory
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());//該工具類上面沒有介紹,在鼠標移動到圖片時顯示提示信息是用Map實現的,這些Map是用該類生成的。
filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);//保存圖表爲文件
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info);//生成Map信息。這些信息寫在pw的輸出流中,這裏的輸出流就是Response.out。也就是直接輸出到頁面了pw.flush();
} catch (NoDataException e) {
System.out.println(e.toString());
filename = "public_nodata_500x300.png";
} catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "public_error_500x300.png";
}
return filename;
}
二.圖表顯示:
<%
......
String filename = WebHitChart.generateBarChart(dDate, session, new PrintWriter(out));//獲得圖片的文件名。注意該語句寫在jsp文件(bar_chart.jsp)的開頭,而用out的封裝類作爲參數,訪問該頁面後可以看到生成Map熱點的內容輸出再該頁面的開頭部分。也就是說最好是把這幾句話寫在頁面有輸出之前。String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;//顯示圖片的Servlet全路徑名,另外文件名作爲該Servlet的參數
......
%>
......
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
src指定了servlet的全路徑名,usermap指定了使用的熱點。
該Servlet必須在WEB-INF/web.xml文件中配置:
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
該Servlet的作用就是將圖片文件的二進制流數據寫道response的輸出流中,在客戶端也就顯示成了圖片。