JFreeChart學習筆記[轉(zhuǎn)載]
一、JFreeChart獲取。WWW的發(fā)展使得基于因特網(wǎng)的應(yīng)用程序不再局限于靜態(tài)或者簡單的動態(tài)內(nèi)容提供。傳統(tǒng)的一些以軟件包形式發(fā)布應(yīng)用程序例如報表系統(tǒng)等都在逐漸搬到因特網(wǎng)上。但是這兩者之間有著天壤之別,雖然對于數(shù)據(jù)獲取、業(yè)務(wù)處理等方面基本類似,但是最大的差別在于用戶界面。為了能在web瀏覽器上顯示要求用戶界面使用HTML以及圖片的方式來展現(xiàn)數(shù)據(jù),而傳統(tǒng)的一些利用操作系統(tǒng)本身的控件來開發(fā)的用戶界面無法適應(yīng)琳瑯滿目的客戶端,因此在這里也變得無能為力。回到本文的題目上來,為了創(chuàng)建一個可以在web瀏覽器上查看到圖表一般有兩種做法:第一種就是使用applet利用java本身對圖形的支持來顯示一個圖表;第二種就是直接在web服務(wù)器端生成好圖表圖片文件后發(fā)送給瀏覽器。第一種方式顯然對于客戶端要求太高,隨著現(xiàn)在主流瀏覽器放棄對JAVA的支持后,這種方式只適合一些局域網(wǎng)的應(yīng)用,而對于因特網(wǎng)的環(huán)境就顯得不太適合。因此我們下面將介紹一個JAVA的圖表引擎JFreeChart用來產(chǎn)生基于WEB的圖表。
JFreeChart項目簡介
JFreeChart是開放源代碼站點SourceForge.net上的一個JAVA項目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區(qū)域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。
JFreeChart是JFreeChart公司在開源網(wǎng)站SourceForge.net上的一個項目,該公司的主要產(chǎn)品有如下:
1、JFreeReport:報表解決工具
2、JFreeChart:Java圖形解決方案(Application/Applet/Servlet/Jsp)
3、JCommon:JFreeReport和JFreeChart的公共類庫
4、JFreeDesigner:JFreeReport的報表設(shè)計工具
獲取地址:http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹)
二、JFreeChart配置安裝
1、解壓jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源碼,jfreechart-0.9.21-demo.jar
是例子程序(該部分留給大家自己去研究)
2、為了配置成功,我們需要關(guān)注的文件有如下三個:jfreechart-0.9.21.jar、libjcommon-0.9.6.jar、
libgnujaxp.jar
3、如果是Application開發(fā),把上述三個文件拷貝到%JAVA_HOME%LIB中,同時在環(huán)境變量CLASSPATH中加入
如果是WEB開發(fā),以TOMCAT中的一個WEB項目TEST為例子說明:
把上述三個文件拷貝到TESTWEB-INFLIB中,然后修改TESTWEB-INFweb.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>
三、JFreeChart功能介紹
JFreeChart目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面:
pie charts (2D and 3D):餅圖(平面和立體)
bar charts (regular and stacked, with an optional 3D effect):柱狀圖
line and area charts:曲線圖
scatter plots and bubble charts
time series, high/low/open/close charts and candle stick charts:時序圖
combination charts:復合圖
Pareto charts
Gantt charts:甘特圖
wind plots, meter charts and symbol charts
wafer map charts
(態(tài)圖表,餅圖(二維和三維) , 柱狀圖 (水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表)
圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關(guān)聯(lián)
JFreeChart核心類庫介紹:
研究jfreechart源碼發(fā)現(xiàn)源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
本身有關(guān),后者與圖形顯示的數(shù)據(jù)有關(guān)。具體研究如果大家有興趣的話可以自己研究,以后有時間我會告訴大家怎么去
研究源碼。
核心類主要有:
org.jfree.chart.JFreeChart:圖表對象,任何類型的圖表的最終表現(xiàn)形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創(chuàng)建不同類型的圖表對象
org.jfree.data.category.XXXDataSet:數(shù)據(jù)集對象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對應(yīng)著很多類型的數(shù)據(jù)集對象類
org.jfree.chart.plot.XXXPlot:圖表區(qū)域?qū)ο螅旧线@個對象決定著什么樣式的圖表,創(chuàng)建該對象的時候需要Axis、Renderer以及數(shù)據(jù)集對象的支持
org.jfree.chart.axis.XXXAxis:用于處理圖表的兩個軸:縱軸和橫軸
org.jfree.chart.render.XXXRender:負責如何顯示一個圖表對象
org.jfree.chart.urls.XXXURLGenerator:用于生成Web圖表中每個項目的鼠標點擊鏈接
XXXXXToolTipGenerator:用于生成圖象的幫助提示,不同類型圖表對應(yīng)不同類型的工具提示類
下面我們來介紹JFreeChart中幾個核心的對象類:
類名 | 類的作用以及簡單描述 |
JFreeChart | 圖表對象,任何類型的圖表的最終表現(xiàn)形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創(chuàng)建不同類型的圖表對象 |
XXXXXDataset | 數(shù)據(jù)集對象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對應(yīng)著很多類型的數(shù)據(jù)集對象類 |
XXXXXPlot | 圖表區(qū)域?qū)ο螅旧线@個對象決定著什么樣式的圖表,創(chuàng)建該對象的時候需要Axis、Renderer以及數(shù)據(jù)集對象的支持 |
XXXXXAxis | 用于處理圖表的兩個軸:縱軸和橫軸 |
XXXXXRenderer | 負責如何顯示一個圖表對象 |
XXXXXURLGenerator | 用于生成Web圖表中每個項目的鼠標點擊鏈接 |
XXXXXToolTipGenerator | 用于生成圖象的幫助提示,不同類型圖表對應(yīng)不同類型的工具提示類 |
很多情況我們不僅僅要求可以在瀏覽器上顯示一個圖表,我們更需要客戶可以直接在圖表上做一下交互的操作,例如獲取信息提示,點擊圖表某個部分進行更詳細信息的展示等等。例如前面生成的簡單柱狀圖,用戶需要在看到柱狀圖后點擊某種水果例如是蘋果即可看到各個地區(qū)蘋果產(chǎn)量的情況。為此就要求該圖形具有交互操作的功能。在HTML中為了讓一個圖像具有可交互的功能就必須給該圖像定義一個Map對象。下表節(jié)選一段具有該功能的HTML代碼
<MAP NAME="chartMap"> <AREA SHAPE="RECT" COORDS="81,15,126,254" href="?series=0&category=100" title="100 = 7,048" onclick="javascript:clickChart('100');return false;"> <AREA SHAPE="RECT" COORDS="143,27,188,255" href="?series=0&category=200" title="200 = 6,721" onclick="javascript: clickChart ('200');return false;"> <AREA SHAPE="RECT" COORDS="205,54,250,255" href="?series=0&category=300" title="300 = 5,929" onclick="javascript: clickChart ('300');return false;"> <AREA SHAPE="RECT" COORDS="267,85,312,255" href="?series=0&category=400" title="400 = 5,005" onclick="javascript: clickChart ('400');return false;"> <AREA SHAPE="RECT" COORDS="329,17,374,255" href="?series=0&category=Diet" title="Diet = 7,017" onclick="javascript: clickChart ('Diet');return false;"> </MAP> |
由此就產(chǎn)生了一個問題:如果根據(jù)一個圖像來生成對應(yīng)的MAP對象。我們回頭看看剛才的代碼,在創(chuàng)建一個圖表對象時候有兩個參數(shù),我們舉柱狀圖的例子來講這兩個參數(shù)就是ChartFactory. createBarChart3D方法中的最后兩個參數(shù),這兩個參數(shù)的類型都是布爾值。這兩個參數(shù)意思分別是:是否創(chuàng)建工具提示(tooltip)以及是否生成URL。這兩個參數(shù)分別對應(yīng)著MAP中一個AREA的title屬性以及href屬性。
可是我想知道的是怎么來產(chǎn)生這個MAP啊!哈哈,不要著急,JFreeChart已經(jīng)幫我們做好生成MAP對象的功能。為了生成MAP對象就要引入另外一個對象:ChartRenderingInfo。因為JFreeChart沒有直接的方法利用一個圖表對象直接生成MAP數(shù)據(jù),它需要一個中間對象來過渡,這個對象就是ChartRenderingInfo。下圖是生成MAP數(shù)據(jù)的流程圖:
如上圖所示,ChartUtilities類是整個流程的核心,它周圍的對象都是一些例如數(shù)據(jù)對象或者是文件等。這個流程簡單描述如下:首先創(chuàng)建一個ChartRenderingInfo對象并在調(diào)用ChartUtilities的writeChartAsJPEG時作為最后一個參數(shù)傳遞進去。調(diào)用該方法結(jié)束后將產(chǎn)生一個圖像文件以及一個填充好MAP數(shù)據(jù)的ChartRenderingInfo對象,有了這個對象我們還是沒有辦法獲取具體的MAP數(shù)據(jù),我們還必須借助于ChartUtilities的writeImageMap方法來將ChartRenderingInfo對象讀取出來,獲取MAP數(shù)據(jù)的代碼片斷如下:
PrintWriter w = null; FileOutputStream fos_jpg = null; FileOutputStream fos_cri = null; try{ //根據(jù)不同類型的圖表使用不同類,以下是針對餅圖的操作 PiePlot plot = (PiePlot) chart.getPlot(); plot.setURLGenerator(new StandardPieURLGenerator(url)); //設(shè)置工具提示 plot.setToolTipGenerator(new StandardPieToolTipGenerator()); fos_jpg = new FileOutputStream(“d:\\fruit.jpg”); ChartUtilities.writeChartAsJPEG( fos_jpg, 100, chart, 400, 300, info); fos_cri = new FileOutputStream(__d:\\fruit.map__); w = new PrintWriter(fos_cri); ChartUtilities.writeImageMap(w, __mapname__, info); w.flush(); }finally{ try{ w.close(); }catch(Exception e){} try{ fos_cri.close(); }catch(Exception e){} try{ fos_jpg.close(); }catch(Exception e){} } |
打開文件D:\fruit.map,文件的內(nèi)容就是要寫到頁面上的MAP數(shù)據(jù)。把生成的圖像文件以及MAP數(shù)據(jù)文件寫到頁面上即可完成熱點圖表的功能。至于怎么結(jié)合兩者之間的關(guān)系例如圖像的useMap屬性值必須與MAP對象的名稱結(jié)合起來,必須根據(jù)實際的應(yīng)用情況進行相應(yīng)的處理。筆者建議把二者通過標簽庫封裝起來,圖像文件的名稱以及MAP對象的名稱由標簽庫統(tǒng)一進行控制,這樣可以保證二者的一致性。
柳德才
13691193654
18942949207
QQ:422157370
liudecai_zan@126.com
湖北-武漢-江夏-廟山
posted on 2009-01-09 02:20 liudecai_zan@126.com 閱讀(962) 評論(0) 編輯 收藏 所屬分類: JFreeChart