版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、使用 JFreeChart來(lái)創(chuàng)建基于web的圖表WWW的發(fā)展使得基于因特網(wǎng)的應(yīng)用程序不再局限于靜態(tài)或者簡(jiǎn)單的動(dòng)態(tài)內(nèi)容提供。傳統(tǒng)的一些以軟件包形式發(fā)布應(yīng)用程序例如報(bào)表系統(tǒng)等都在逐漸搬到因特網(wǎng)上。但是這兩者之間有著天壤之別,雖然對(duì)于數(shù)據(jù)獲取、業(yè)務(wù)處理等方面基本類似,但是最大的差別在于用戶界面。為了能在web瀏覽器上顯示要求用戶界面使用HTML以及圖片的方式來(lái)展現(xiàn)數(shù)據(jù),而傳統(tǒng)的一些利用操作系統(tǒng)本身的控件來(lái)開發(fā)的用戶界面無(wú)法適應(yīng)琳瑯滿目的客戶端,因此在這里也變得無(wú)能為力?;氐奖疚牡念}目上來(lái),為了創(chuàng)建一個(gè)可以在web瀏覽器上查看到圖表一般有兩種做法:第一種就是使用applet利用java本身對(duì)圖形的支持
2、來(lái)顯示一個(gè)圖表;第二種就是直接在web服務(wù)器端生成好圖表圖片文件后發(fā)送給瀏覽器。第一種方式顯然對(duì)于客戶端要求太高,隨著現(xiàn)在主流瀏覽器放棄對(duì)JAVA的支持后,這種方式只適合一些局域網(wǎng)的應(yīng)用,而對(duì)于因特網(wǎng)的環(huán)境就顯得不太適合。因此我們下面將介紹一個(gè)JAVA的圖表引擎JFreeChart用來(lái)產(chǎn)生基于WEB的圖表。 一、JFreeChart項(xiàng)目簡(jiǎn)介 JFreeChart是開放源代碼站點(diǎn)SourceF上的一個(gè)JAVA項(xiàng)目,它主要用來(lái)各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區(qū)域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。這些不同式樣的圖表基本上可以滿足目前的要求。為
3、了減少篇幅本文主要介紹前面三種類型的圖表,讀者可以觸類旁通去開發(fā)其他樣式的圖表。下面幾個(gè)是JFreeChart產(chǎn)生的這三種類型圖表的結(jié)果: 圖1 圖2 圖3 上面的三個(gè)圖都是表示四個(gè)季度的某個(gè)產(chǎn)品的銷量信息。在繼續(xù)下面小節(jié)之前必須先準(zhǔn)備好開發(fā)環(huán)境,因?yàn)槭腔赪EB瀏覽器的圖表展現(xiàn),因此需要一個(gè)Servlet引擎或者是J2EE應(yīng)用服務(wù)器(例如WebSphere,Tomcat等)。WEB環(huán)境的搭建就不累贅了,讀者根據(jù)喜好自行安裝。JFreeChart引擎本身需要到SourceF上下載,地址如下: JFreeChart主頁(yè):/jfreechart/index.h
4、tml JFreeChart下載頁(yè)面: 下載的時(shí)候需要注意的是必須下載兩個(gè)文件:JFreeChart以及Jcommon。目前最新配套版本是:JFreeChart 0.9.11 Jcommon 0.8.6 這里有點(diǎn)筆者在開發(fā)中遇見(jiàn)的問(wèn)題需要注意的是:在使用Eclipse開發(fā)的時(shí)候會(huì)報(bào)一個(gè)莫名其妙的錯(cuò)誤,錯(cuò)誤可能指向某個(gè)類文件的第一行。遇到這樣的問(wèn)題一般是因?yàn)闆](méi)有把Jcommon的jar包設(shè)置到項(xiàng)目的類路徑中的緣故。具體的原因不祥。 二、解讀JFreeChart的源碼結(jié)構(gòu) 在開始使用JFreeChart之前我們有必要先大概了解一下JFreeChart本身的結(jié)構(gòu)以及它所帶一些例子程序,這樣有助于我們
5、下一步自行開發(fā)。下載JFreeChart包后已經(jīng)帶有非常豐富的例子,因?yàn)镴FreeChart這個(gè)項(xiàng)目本身的使用文檔非常少,因此學(xué)習(xí)它最好的辦法就是學(xué)習(xí)它所帶的例子源碼。在包org.jfree.chart.demo中有幾十個(gè)文件用于展示JFreeChart所能支持的所有圖表的結(jié)果。如果你的JDK是比較新的情況下可能在運(yùn)行這些例子時(shí)會(huì)有問(wèn)題,現(xiàn)象如下: java.lang.UnsatisfiedLinkError: initDDraw at sun.awt.windows.Win32OffScreenSurfaceData.initDDraw(Native Method) at sun.awt.w
6、indows.Win32OffScreenSurfaceData.<clinit>(Win32OffScreenSurfaceData.java:141) at sun.awt.Win32GraphicsDevice.<clinit>(Win32GraphicsDevice.java:58) at sun.awt.Win32GraphicsEnvironment.makeScreenDevice(Win32GraphicsEnvironment.java:168) at sun.java2d.SunGraphicsEnvironment.getScreenDevices
7、(SunGraphicsEnvironment.java:240) at sun.awt.Win32GraphicsEnvironment.getDefaultScreenDevice(Win32GraphicsEnvironment.java:61) at java.awt.Window.init(Window.java:224) at java.awt.Window.<init>(Window.java:268) at java.awt.Frame.<init>(Frame.java:398) at javax.swing.JFrame.<init>(J
8、Frame.java:198) at org.jfree.chart.demo.JFreeChartDemo.<init>(JFreeChartDemo.java:148) at org.jfree.chart.demo.JFreeChartDemo.main(JFreeChartDemo.java:285) Exception in thread "main" 這個(gè)錯(cuò)誤是由于新版的Swing大量的使用了微軟的DirectDraw的技術(shù)來(lái)提高畫圖的性能,而可能你的顯卡在這時(shí)候會(huì)跟你鬧點(diǎn)情緒或者顯卡本身并不支持這樣的一個(gè)技術(shù)。難道就沒(méi)有辦法了嘛?要解決這個(gè)問(wèn)題也非
9、常簡(jiǎn)單,我們可以屏蔽掉DirectDraw,不讓Swing使用該技術(shù)就可以了。在運(yùn)行這些代碼時(shí)給虛擬機(jī)指定參數(shù)-Dsun.java2d.noddraw即可。 這時(shí)可能你又該納悶了,不說(shuō)是基于Web的圖表嘛,怎么又扯到Swing上了?這是因?yàn)闉榱耸归_發(fā)者容易上手,無(wú)需配置任何運(yùn)行環(huán)境,所以這些例子都是基于GUI方式的用于展現(xiàn)給開發(fā)者如果生成一個(gè)圖表,我們要學(xué)習(xí)的也就是如何利用這個(gè)引擎生成圖表而不是怎么來(lái)顯示一個(gè)圖表。當(dāng)我們把生成的圖表對(duì)象Export到一個(gè)圖像文件即可在Web上發(fā)布。 下面我們來(lái)介紹JFreeChart中幾個(gè)核心的對(duì)象類: 類名 類的作用以及簡(jiǎn)單描述 JFreeChart 圖表對(duì)
10、象,任何類型的圖表的最終表現(xiàn)形式都是在該對(duì)象進(jìn)行一些屬性的定制。JFreeChart引擎本身提供了一個(gè)工廠類用于創(chuàng)建不同類型的圖表對(duì)象 XXXXXDataset 數(shù)據(jù)集對(duì)象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對(duì)應(yīng)著很多類型的數(shù)據(jù)集對(duì)象類 XXXXXPlot 圖表區(qū)域?qū)ο螅旧线@個(gè)對(duì)象決定著什么樣式的圖表,創(chuàng)建該對(duì)象的時(shí)候需要Axis、Renderer以及數(shù)據(jù)集對(duì)象的支持 XXXXXAxis 用于處理圖表的兩個(gè)軸:縱軸和橫軸 XXXXXRenderer 負(fù)責(zé)如何顯示一個(gè)圖表對(duì)象 XXXXXURLGenerator 用于生成Web圖表中每個(gè)項(xiàng)目的鼠標(biāo)點(diǎn)擊鏈接 XXXXXToolTip
11、Generator 用于生成圖象的幫助提示,不同類型圖表對(duì)應(yīng)不同類型的工具提示類 基本上我認(rèn)為JFreeChart項(xiàng)目本身的類結(jié)構(gòu)的設(shè)計(jì)并不是很好,首先在創(chuàng)建圖表的時(shí)候用到了大量的工廠方法,這樣做雖然可以簡(jiǎn)化創(chuàng)建圖表對(duì)象的代碼,但是對(duì)項(xiàng)目本身或者開發(fā)人員來(lái)講自行擴(kuò)展一種新的圖表都仍然是一件很麻煩的事情;其次除圖表對(duì)象本身外其余的類過(guò)于復(fù)雜,使用者必須去了解每個(gè)類型的圖表對(duì)象應(yīng)該對(duì)應(yīng)哪些Axis、Plot、Renderer類,并且必須非常熟悉這些類的構(gòu)造函數(shù)中每個(gè)參數(shù)的具體含義。這些問(wèn)題都大大困擾很多初學(xué)者。不過(guò),雖然存在很多問(wèn)題,但是JFreeChart本身仍不失為一個(gè)非常優(yōu)秀的圖表引擎,況且
12、項(xiàng)目本身也在逐漸的發(fā)展中。 在非常簡(jiǎn)略的介紹了JFreeChart本身的代碼結(jié)構(gòu)后,下面我們開始動(dòng)手試驗(yàn)幾個(gè)常用的圖表并把他們放到web上。 三、使用JFreeChart生成各種樣式的圖表 限于篇幅的問(wèn)題我們?cè)谶@里只實(shí)現(xiàn)兩種常用的圖表,其他類型圖表讀者可以觸類旁通。我們先給出柱狀圖的實(shí)現(xiàn),餅圖的實(shí)現(xiàn)再來(lái)跟柱狀圖進(jìn)行比較。 1 柱狀圖 package lius.chart.demo; import java.io.*; import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; /* * 該類
13、用于演示最簡(jiǎn)單的柱狀圖生成 * author Winter Lau */ public class BarChartDemo public static void main(String args) throws IOException CategoryDataset dataset = getDataSet2(); JFreeChart chart = ChartFactory.createBarChart3D( "水果產(chǎn)量圖", / 圖表標(biāo)題 "水果", / 目錄軸的顯示標(biāo)簽 "產(chǎn)量", / 數(shù)值軸的顯示標(biāo)簽 dataset, /
14、 數(shù)據(jù)集 PlotOrientation.VERTICAL, / 圖表方向:水平、垂直 true, / 是否顯示圖例(對(duì)于簡(jiǎn)單的柱狀圖必須是false) false, / 是否生成工具 false / 是否生成URL鏈接 ); FileOutputStream fos_jpg = null; try fos_jpg = new FileOutputStream("D:fruit.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); finally try fos_jpg.close()
15、; catch (Exception e) /* * 獲取一個(gè)演示用的簡(jiǎn)單數(shù)據(jù)集對(duì)象 * return */ private static CategoryDataset getDataSet() DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, null, "蘋果"); dataset.addValue(200, null, "梨子"); dataset.addValue(300, null, "葡萄"); dat
16、aset.addValue(400, null, "香蕉"); dataset.addValue(500, null, "荔枝"); return dataset; /* * 獲取一個(gè)演示用的組合數(shù)據(jù)集對(duì)象 * return */ private static CategoryDataset getDataSet2() DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, "北京", "蘋果"); d
17、ataset.addValue(100, "上海", "蘋果"); dataset.addValue(100, "廣州", "蘋果"); dataset.addValue(200, "北京", "梨子"); dataset.addValue(200, "上海", "梨子"); dataset.addValue(200, "廣州", "梨子"); dataset.addValue(300, &quo
18、t;北京", "葡萄"); dataset.addValue(300, "上海", "葡萄"); dataset.addValue(300, "廣州", "葡萄"); dataset.addValue(400, "北京", "香蕉"); dataset.addValue(400, "上海", "香蕉"); dataset.addValue(400, "廣州", "香蕉"
19、;); dataset.addValue(500, "北京", "荔枝"); dataset.addValue(500, "上海", "荔枝"); dataset.addValue(500, "廣州", "荔枝"); return dataset; 程序運(yùn)行結(jié)束后生成的圖片文件效果如下圖所示: 圖4 如果是使用簡(jiǎn)單的數(shù)據(jù)即使用getDataSet方法獲取數(shù)據(jù)集時(shí)產(chǎn)生的圖片文件如下: 圖5 2 餅圖 對(duì)于餅圖而言,數(shù)據(jù)集的獲取用的不是同一個(gè)數(shù)據(jù)集類,另外餅圖不支持同一個(gè)類別的項(xiàng)
20、目中還有子項(xiàng)目這樣的數(shù)據(jù)。我們只給出創(chuàng)建餅圖的代碼,至于寫圖表到一個(gè)文件則與柱狀圖一致,無(wú)需重復(fù)。 package lius.chart.demo; import java.io.*; import org.jfree.data.*; import org.jfree.chart.*; /* * 用于演示餅圖的生成 * author Winter Lau */ public class PieChartDemo public static void main(String args) throws IOException DefaultPieDataset data = getDataSet(
21、); JFreeChart chart = ChartFactory.createPie3DChart("水果產(chǎn)量圖", / 圖表標(biāo)題 data, true, / 是否顯示圖例 false, false ); /寫圖表對(duì)象到文件,參照柱狀圖生成源碼 /* * 獲取一個(gè)演示用的簡(jiǎn)單數(shù)據(jù)集對(duì)象 * return */ private static DefaultPieDataset getDataSet() DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("蘋果",1
22、00); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setValue("荔枝",500); return dataset; 生成的餅圖文件效果如下: 圖6 四、將生成的圖表移到瀏覽器上 為了將生成的圖表直接傳給客戶端瀏覽器,只需要將前面兩個(gè)例子中的文件流換成是通過(guò)HttpServletResponse對(duì)象獲取到的輸出流,詳細(xì)代碼清單如下: package lius.chart
23、.demo; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServlet; import org.jfree.data.*; import org.jfree.chart.*; /* * 演示通過(guò)servlet直接輸出圖表 * author Winter Lau */ public class ChartDemoServlet extends HttpServlet public void service(ServletRequest req, ServletResponse
24、 res) throws ServletException, IOException res.setContentType("image/jpeg"); DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPie3DChart("水果產(chǎn)量圖", data, true, false, false ); ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 100,chart,400,300,null)
25、; /* * 獲取一個(gè)演示用的簡(jiǎn)單數(shù)據(jù)集對(duì)象 * return */ private static DefaultPieDataset getDataSet() DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("蘋果",100); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setVal
26、ue("荔枝",500); return dataset; 高級(jí)主題 很多情況我們不僅僅要求可以在瀏覽器上顯示一個(gè)圖表,我們更需要客戶可以直接在圖表上做一下交互的操作,例如獲取信息提示,點(diǎn)擊圖表某個(gè)部分進(jìn)行更詳細(xì)信息的展示等等。例如前面生成的簡(jiǎn)單柱狀圖,用戶需要在看到柱狀圖后點(diǎn)擊某種水果例如是蘋果即可看到各個(gè)地區(qū)蘋果產(chǎn)量的情況。為此就要求該圖形具有交互操作的功能。在HTML中為了讓一個(gè)圖像具有可交互的功能就必須給該圖像定義一個(gè)Map對(duì)象。下表節(jié)選一段具有該功能的HTML代碼 <MAP NAME="chartMap"> <AREA SHA
27、PE="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&categ
28、ory=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
29、(´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=
30、"329,17,374,255" href="?series=0&category=Diet" title="Diet = 7,017" onclick="javascript: clickChart (´Diet´);return false;"> </MAP> 由此就產(chǎn)生了一個(gè)問(wèn)題:如果根據(jù)一個(gè)圖像來(lái)生成對(duì)應(yīng)的MAP對(duì)象。我們回頭看看剛才的代碼,在創(chuàng)建一個(gè)圖表對(duì)象時(shí)候有兩個(gè)參數(shù),我們舉柱狀圖的例子來(lái)講這兩個(gè)參數(shù)就是ChartFactory. createBarCha
31、rt3D方法中的最后兩個(gè)參數(shù),這兩個(gè)參數(shù)的類型都是布爾值。這兩個(gè)參數(shù)意思分別是:是否創(chuàng)建工具提示(tooltip)以及是否生成URL。這兩個(gè)參數(shù)分別對(duì)應(yīng)著MAP中一個(gè)AREA的title屬性以及href屬性。 可是我想知道的是怎么來(lái)產(chǎn)生這個(gè)MAP?。」?,不要著急,JFreeChart已經(jīng)幫我們做好生成MAP對(duì)象的功能。為了生成MAP對(duì)象就要引入另外一個(gè)對(duì)象:ChartRenderingInfo。因?yàn)镴FreeChart沒(méi)有直接的方法利用一個(gè)圖表對(duì)象直接生成MAP數(shù)據(jù),它需要一個(gè)中間對(duì)象來(lái)過(guò)渡,這個(gè)對(duì)象就是ChartRenderingInfo。下圖是生成MAP數(shù)據(jù)的流程圖: 圖7 如上圖所示,ChartUtilities類是整個(gè)流程的核心,它周圍的對(duì)象都是一些例如數(shù)據(jù)對(duì)象或者是文件等。這個(gè)流程簡(jiǎn)單描述如下:首先創(chuàng)建一個(gè)ChartRenderingInfo對(duì)象并在調(diào)用ChartUtilit
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年綠色糧油生產(chǎn)基地建設(shè)項(xiàng)目合作合同3篇
- 2025車位轉(zhuǎn)讓合同協(xié)議書
- 個(gè)人承包2024年度生產(chǎn)線物料管理合同3篇
- 二零二五年度特色商業(yè)街區(qū)物業(yè)維護(hù)及租賃管理合同3篇
- 2025農(nóng)村土地承包經(jīng)營(yíng)權(quán)轉(zhuǎn)包出租合同
- 2025土方回填項(xiàng)目承包合同
- 專員勞動(dòng)合同(2024年版)
- 2025年度個(gè)人教育機(jī)構(gòu)股權(quán)無(wú)償轉(zhuǎn)讓協(xié)議3篇
- 2025大梁租賃合同
- 二零二五年度蟲害防治與食品安全保障合同4篇
- 2022年睪丸腫瘤診斷治療指南
- 被執(zhí)行人給法院執(zhí)行局寫申請(qǐng)范本
- 飯店管理基礎(chǔ)知識(shí)(第三版)中職PPT完整全套教學(xué)課件
- 2023年重慶市中考物理A卷試卷【含答案】
- 從中國(guó)制造到中國(guó)創(chuàng)造(優(yōu)秀課件)
- 【打印版】意大利斜體英文字帖(2022年-2023年)
- 2023年浙江省嘉興市中考數(shù)學(xué)試題及答案
- 【考試版】蘇教版2022-2023學(xué)年四年級(jí)數(shù)學(xué)下冊(cè)開學(xué)摸底考試卷(五)含答案與解析
- 《分?jǐn)?shù)的基本性質(zhì)》數(shù)學(xué)評(píng)課稿10篇
- 第八章 客戶關(guān)系管理
- 新版人教版高中英語(yǔ)選修一、選修二詞匯表
評(píng)論
0/150
提交評(píng)論