版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、用JFreeChart增強JSP報表的用戶體驗 JFreeChart是一組功能強大、靈活易用的Java繪圖API,使用它可以生成多種通用性的報表,包括柱狀圖、餅圖、曲線圖、甘特圖等。它能夠用在Swing和Web等中制作自定義的圖表或報表,并且得到廣泛的應用。本文將通過引領讀者學習在JFreeChart中餅圖、柱狀圖和曲線圖的進階應用,來達到熟練使用JFreeChart的目的。 一下載與環(huán)境配置1. 下載JFreeChartJFreeChart是開放源代碼的免費軟件,但是它的支持文檔需要付費才能得到。其下載地址為:說明:1)source目錄:為jfreechart的源碼目錄;2)lib目錄:為包
2、目錄,我們需要關注的包為jfreechart-1.0.6.jar、gnujaxp.jar和jcommon-1.0.10.jar這三個包;3)根目錄下的jfreechart-1.0.6-demo.jar是例子程序,大家雙擊后可看到其中有很多例子的運行結果。2. 環(huán)境配置筆者的開發(fā)環(huán)境如下:JDK:1.5MyEclipse:5.1.1 GATomcat:5.5.28為了后續(xù)的“用JFreeChart創(chuàng)建基于Web的圖表”的一個例子的展示,我們在MyEclipse中創(chuàng)建一個名為jfreechart的Web工程。將下載的JFreeChart1.0.6下lib目錄下的jar包拷貝到WebRoot/WEB
3、-INF/lib目錄下。另外還需要在web.xml文件中增加如下配置:<servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class></servlet><servlet-mapping> <servlet-name>
4、;DisplayChart</servlet-name> <url-pattern>/DisplayChart</url-pattern></servlet-mapping>二 柱狀圖在WebRoot目錄下建立bar目錄,用來存放柱狀圖的各個例子。首先在該目錄下建立一個sample1.js
5、p文件,讓我們來看一個簡單的柱狀圖的例子,修改后的sample1.jsp的內容如下所示:<% page contentType="text/html;charset=GBK"%><% page import="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart,
6、; org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.DefaultCategoryDataset"%><%Def
7、aultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(610, "廣州", "豬肉");dataset.addValue(220, "廣州", "牛肉");dataset.addValue(530, "廣州", "雞肉");dataset.addValue(340, &q
8、uot;廣州", "魚肉");JFreeChart chart = ChartFactory.createBarChart3D("肉類銷量統(tǒng)計圖", "肉類",
9、0; "銷量", dataset, PlotO
10、rientation.VERTICAL, false, false,
11、0; false);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fi
12、lename;%><img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">在瀏覽器中輸入地址:http:/localhost:8080/jfreechart/bar/sample1.jsp,可看到如下柱狀圖:上面的這個柱狀圖比較簡單,稍顯單調,在有些情況下,我們需要用不同顏色來表示不同的種類,或者在種類上標上具體數(shù)值,亦或需要加
13、上3D水晶效果。下面讓我們來做更深一步的探討。接下來讓我們看一個用不同顏色來表示不通種類的例子。在WebRoot的bar目錄下新建sample2.jsp頁面,將其代碼修改如下:<% page contentType="text/html;charset=GBK"%><% page import="org.jfree.chart.ChartFactory,
14、 org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.CategoryDataset,org.jfree.data.general.DatasetUtilities"%><%double data = newdouble 1310, 720, 1130,
15、440;String rowKeys = "豬肉", "牛肉","雞肉", "魚肉"String columnKeys = ""CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); JFreeChart chart
16、160;= ChartFactory.createBarChart3D("廣州肉類銷量統(tǒng)計圖", "肉類","銷量",dataset,PlotOrientation.VERTICAL,true,false,false);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String graphURL =
17、request.getContextPath() + "/DisplayChart?filename=" + filename;%><img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>"> 該頁面的
18、運行效果如下圖所示: 對比該例與前例,可看出createBarChart3D的倒數(shù)第三個參數(shù)修改成了true,該參數(shù)可用來顯示下方的:。上兩例我們顯示的只是一個城市的肉類銷量,有時候我們有對比顯示多個城市的不同肉類,只要將上例稍作修改即可。例如要在圖中表示廣州、深圳、東莞、佛山四個城市的四個肉類的銷售情況,只需要將如下三句稍做修改: double data = newdouble 1310, 720, 1130,
19、160;440;String rowKeys = "豬肉", "牛肉","雞肉", "魚肉"String columnKeys = "" 例如修改成:double data = newdouble 1310, 1220, 1110, 1000,
20、; 720, 700, 680, 640, 1130, 1020, 980, 800, 440, 400, 360, 300;String rowKeys = "豬肉", "牛肉","雞肉", &quo
21、t;魚肉"String columnKeys = "廣州", "深圳", "東莞", "佛山" 在運行該jsp頁面,可看到如下界面: 在上述幾例中,在某個柱子上都沒有顯示相應的數(shù)值,下面讓我們?yōu)槊總€柱子都加上它的數(shù)值,我們新建一個sample4.jsp頁面,其內容如下: <% page contentTy
22、pe="text/html;charset=GBK"%><% page import="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, &
23、#160;org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.CategoryDataset,org.jfree.data.general.DatasetUtilities,
24、; org.jfree.chart.plot.*, org.jfree.chart.labels.*,org.jfree.chart.renderer.category.BarRenderer3D,
25、; java.awt.*, org.jfree.ui.*, org.jfree.chart.axis.AxisLocation
26、"%><%double data = newdouble 1310, 1220, 1110, 1000, 720, 700, 680, 640, 1130, 1020, 980, 800, 440, 400, 360, 300;String rowKeys =
27、 "豬肉", "牛肉","雞肉", "魚肉"String columnKeys = "廣州", "深圳", "東莞", "佛山"CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys,
28、data); JFreeChart chart = ChartFactory.createBarChart3D("肉類銷量統(tǒng)計圖", "肉類",
29、60; "銷量", dataset, PlotOrientation.VERTICAL,
30、60; true, true,
31、; false);CategoryPlot plot = chart.getCategoryPlot();/設置網格背景顏色plot.setBackgroundPaint(Color.white);/設置網格豎線顏色plot.setDomainGridlinePaint(Color.pink);/設置網格橫線顏色plot.setRangeGridlinePaint(Color.pink);/顯示每個柱的數(shù)值,并修改該數(shù)值的字體屬性BarRenderer3D renderer =
32、;new BarRenderer3D();renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator();renderer.setBaseItemLabelsVisible(true);/默認的數(shù)字顯示在柱子中,通過如下兩句可調整數(shù)字的顯示/注意:此句很關鍵,若無此句,那數(shù)字的顯示會被覆蓋,給人數(shù)字沒有顯示出來的問題renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OU
33、TSIDE12, TextAnchor.BASELINE_LEFT);renderer.setItemLabelAnchorOffset(10D);/設置每個地區(qū)所包含的平行柱的之間距離/renderer.setItemMargin(0.3);plot.setRenderer(renderer);/設置地區(qū)、銷量的顯示位置/將下方的“肉類”放到上方plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);/將默認放在左邊的“銷量”放到右方plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_
34、RIGHT);String filename = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, session);String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;%><img src="<%= graphURL&
35、#160;%>"width=700 height=400 border=0 usemap="#<%= filename %>"> 運行效果如下所示:注意:jfreechart的很多版本不兼容,請大家在運行此例時確認下載了對應的版本。三 餅圖在WebRoot目錄下建立名為pie的子目錄,用來存
36、放本教程中餅圖的實例jsp頁面。下面讓我們來看一個簡單的三維餅圖。首先在pie目錄下建立一個名為sample1.jsp的頁面。在JFreeChart中,與餅圖繪制密切相關的類如下:1) PiePlot餅圖繪制類,可以用來設置餅圖的相關屬性。例如:PiePlot pieplot = (PiePlot)jfreechart.getPlot();pieplot.setLabelFont(new Font("SansSerif", 0, 12);pieplot.setNoDataMessage("No&
37、#160;data available");pieplot.setCircular(false);pieplot.setLabelGap(0.02D);2) DefaultPieDataset默認的餅圖數(shù)據集類,用來存儲餅圖顯示的相關數(shù)據信息。例如:DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("品德", new Double(0.2D);dataset.setValue("體育&qu
38、ot;, new Double(0.2D);dataset.setValue("音樂", new Double(0.2D);dataset.setValue("其余成績", new Double(0.4D);3) ChartFactory可利用該制圖工廠類createPieChart來創(chuàng)建一個餅圖的JFreeChart對象,例如:JFreeChart jfreechart = ChartFactory.createPieChart("餅圖示例", dataset,
39、true, true, false); 下面讓我們看一個簡單的例子,修改sample1.jsp的內容如下: <% page contentType="text/html;charset=GBK"%><% page import="org.jfree.chart.*,
40、0; org.jfree.chart.plot.PiePlot, org.jfree.data.general.DefaultPieDataset,org.jfree.chart.servlet.ServletUtilities, &
41、#160; java.awt.*"%><%/設置數(shù)據集DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("初中高級程序員", 0.55);dataset.setValue("項目經理", 0.1);dataset.setValue("系統(tǒng)分析師", 0.1);dataset.setValue("軟件架構師",
42、0;0.1);dataset.setValue("其他", 0.2);/通過工廠類生成JFreeChart對象JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, true, false, false);PiePlot pieplot = (PiePlot) chart.getPlot();pieplot.setLabelFont(new
43、Font("宋體", 0, 12);/沒有數(shù)據的時候顯示的內容pieplot.setNoDataMessage("無數(shù)據顯示");pieplot.setCircular(false);pieplot.setLabelGap(0.02D);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String graphURL = r
44、equest.getContextPath() + "/DisplayChart?filename=" + filename;%><img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>"> 可以看出,餅圖的繪制與
45、柱狀圖的繪制類似,該例的運行效果如下:有時候我們還想知道某塊所占的具體分值,或者需要突出顯示某一塊。這時候需要對上例進行部分修改:dataset.setValue("其他", 0.2);后的那段改成:/通過工廠類生成JFreeChart對象JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, true, false, false);PiePlot pieplot = (
46、PiePlot) chart.getPlot();pieplot.setLabelFont(new Font("宋體", 0, 12);/沒有數(shù)據的時候顯示的內容pieplot.setNoDataMessage("無數(shù)據顯示");pieplot.setCircular(false);setExplodePercent方法很重要,它將Label為某名稱的某塊挖出來突出顯示,而后兩句實現(xiàn)的效果是在“初中高級程序員”等名稱后加上百分比,改成“初中高級程序員=55%”等。加上如上的代碼后,同時還需要將相關的兩個java包:
47、org.jfree.chart.labels.StandardPieSectionLabelGenerator和java.text.NumberFormat引入到該jsp頁面中。此時的運行結果如下: 通過JFreeChart還可以提供漂亮的水晶餅圖效果,接著讓我們新建一個sample3.jsp頁面來體驗一下超炫美圖吧。修改sample3.jsp頁面如下:<% page contentType="text/html;charset=GBK"%><% page
48、 import="org.jfree.chart.*,org.jfree.chart.servlet.ServletUtilities, org.jfree.util.Rotation,org.jfree.data.general.DefaultPieDataset,org.jfree.chart.plot.PiePlot3D"%><%/設置數(shù)據集Def
49、aultPieDataset dataset = new DefaultPieDataset();dataset.setValue("初中高級程序員", 0.55);dataset.setValue("項目經理", 0.1);dataset.setValue("系統(tǒng)分析師", 0.1);dataset.setValue("軟件架構師", 0.1);dataset.setValue("其他", 0.2);/通
50、過工廠類生成JFreeChart對象JFreeChart chart = ChartFactory.createPieChart3D("IT行業(yè)職業(yè)分布圖", dataset, true, true, false);/獲得3D的水晶餅圖對象PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();/設置開始角度pieplot3d.setStartAngle(150D);/設置方向為”順時針方向“pieplot3d.setDi
51、rection(Rotation.CLOCKWISE);/設置透明度,0.5F為半透明,1為不透明,0為全透明pieplot3d.setForegroundAlpha(0.5F);pieplot3d.setNoDataMessage("無數(shù)據顯示"); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String
52、;graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;%><img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">
53、利用setForegroundAlpha()方法可以設置3D餅圖的透明度,利用setStartAngle()可以設置其開始角度,利用setDirection()方法可以設置其方向。該例的運行效果如下圖所示: 四曲線圖接著我們來介紹曲線圖的使用。在筆者日常的開發(fā)工作中,曲線圖用得最多,它可以用來繪制趨勢圖、統(tǒng)計分析等。首先我們在WebRoot下建立一個line目錄,用來存放曲線圖實例的jsp頁面。我們在該目錄下建立sample1.jsp頁面來做一個簡單的曲線圖的例子。在開始編碼前,讓我們來看看與畫曲線圖密切相關的幾個類:1) TimeSeriesCo
54、llection曲線數(shù)據的集合。2) TimeSeries曲線信息序列。3) ChartFactory可以利用該類的createTimeSeriesChart方法來創(chuàng)建曲線的JFreeChart對象。在下例中,我們顯示阿蜜果的blog在2007年度各月份的訪問量情況,修改后的sample1.jsp的內容如下:<% page contentType="text/html;charset=GBK"%><% page import = "org.jfree.chart.Ch
55、artFactory,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.ServletUtilities,org.jfree.chart.title.TextTitle,org.jfree.data.time.TimeSeries,org.jfree.data.time.Month,org.jfree.data.time.TimeSeriesCollection,java.awt.Font"%><%/訪問量統(tǒng)計時間線TimeSeries timeSeries = new TimeS
56、eries("阿蜜果blog訪問量統(tǒng)計", Month.class);/時間曲線數(shù)據集合TimeSeriesCollection lineDataset = new TimeSeriesCollection();/構造數(shù)據集合timeSeries.add(new Month(1, 2007), 11200);timeSeries.add(new Month(2, 2007), 9000);timeSeries.add(new Month(3, 2
57、007), 6200);timeSeries.add(new Month(4, 2007), 8200);timeSeries.add(new Month(5, 2007), 8200);timeSeries.add(new Month(6, 2007), 12200);timeSeries.add(new Month(7, 2007), 13200);timeSeries.add(new Month(8, 2007), 8300);t
58、imeSeries.add(new Month(9, 2007), 12400);timeSeries.add(new Month(10, 2007), 12500);timeSeries.add(new Month(11, 2007), 13600);timeSeries.add(new Month(12, 2007), 12500);lineDataset.addSeries(timeSeries);JFreeChart chart = Ch
59、artFactory.createTimeSeriesChart("訪問量統(tǒng)計時間線", "月份", "訪問量", lineDataset, true, true, true);/設置子標題TextTitle subtitle = new TextTitle("2007年度", new Font("黑體", Font.BOLD, 12);chart.addS
60、ubtitle(subtitle);/設置主標題chart.setTitle(new TextTitle("阿蜜果blog訪問量統(tǒng)計", new Font("隸書", Font.ITALIC, 15);chart.setAntiAlias(true);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String
61、graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;%><img src="<%= graphURL %>"width=500 height=300 border=0 usemap="#<%= filename %>">運行后的曲線效果如下圖所示:
62、 有時我們需要顯示各數(shù)據點及其數(shù)值,這是我們需要對上例進行一點改動,在JFreeChart chart = ChartFactory.createTimeSeriesChart后,TextTitle subtitle = new TextTitle前加上如下的代碼:XYPlot plot = (XYPlot) chart.getPlot();XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getR
63、enderer();/設置網格背景顏色plot.setBackgroundPaint(Color.white);/設置網格豎線顏色plot.setDomainGridlinePaint(Color.pink);/設置網格橫線顏色plot.setRangeGridlinePaint(Color.pink);/設置曲線圖與xy軸的距離plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D);/設置曲線是否顯示數(shù)據點xylineandshaperenderer.setBaseShapesVisible(tr
64、ue);/設置曲線顯示各數(shù)據點的值XYItemRenderer xyitem = plot.getRenderer(); xyitem.setBaseItemLabelsVisible(true); xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT);xyitem.setBaseItemLabelGen
65、erator(new StandardXYItemLabelGenerator();xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14);plot.setRenderer(xyitem); 并引入了一些另外的包,引入包的語句變成:<% page import = "org.jfree.chart.ChartFactory,org.jfree.chart.title.TextTitl
66、e,org.jfree.data.time.TimeSeries,org.jfree.data.time.Month,org.jfree.data.time.TimeSeriesCollection,org.jfree.chart.plot.XYPlot,org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,java.awt.Color,org.jfree.ui.RectangleInsets,java.awt.Font,org.jfree.chart.renderer.xy.XYItemRenderer,org.jfree.chart.JFre
67、eChart,org.jfree.chart.servlet.ServletUtilities,org.jfree.chart.labels.*,org.jfree.ui.*"%> 運行該實例,效果如下所示: 上面兩例的曲線圖都是單曲線的,有時候我們對兩個曲線進行比較,例如對阿蜜果在2006年度和2007年度的blog訪問量進行比較,在此種情況下,我們需要在一個曲線圖中顯示兩個曲線。在此種情況下,我們只需要在sample1.jsp的基礎上新建一個TimeSeries對象,給它添加數(shù)據后,將其添加到TimeSeriesCollection型數(shù)據集合對象中,修改后的程序主體部分如下所示:/訪問量統(tǒng)計時間線TimeSeries timeSeries2006 = new TimeSeries("2006年度", Month.class);TimeSeries timeSeries2007 = new TimeSeries("2007年度", Month.class);/時間曲線數(shù)據集合TimeSeriesCollection lineDataset = new
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海報設計合同模板
- 家庭雇傭保姆合同樣式參考
- 2024獨家原創(chuàng)企業(yè)績效合同簽定儀式領導講話稿
- 2024租賃辦公室合同范本
- 個人教育助學貸款
- 購房借款協(xié)議2024年
- 籃球訓練合作協(xié)議范本
- 房產代理合同租賃
- 個人消費借款合同范本
- 提升機租賃合同樣本格式
- 頭頸部體格檢查評分標準(共3頁)
- 淺談高中英語教學中學生創(chuàng)造性思維的培養(yǎng)
- 配電設備的日常管理及維護保養(yǎng)(PPT41頁)
- 電子琴伴奏及音色中英文對照表
- 蘇教版初中化學常見氣體的檢驗與除雜教案
- 網絡教研——開辟校本教研新模式
- 火災報警系統(tǒng)技術規(guī)范書
- 魚塘租賃合同
- 教材自編傳統(tǒng)節(jié)日校本課程
- hydac壓力繼電器說明書
- 中成藥上市公司組織架構及部門職責
評論
0/150
提交評論