jfreechart 的Java對象關系簡釋
博客中國分類:Java技術,
jfreechart是一個優秀的開源Java 2D項目,缺點是缺乏文檔,中英文都是如此。本文是經驗總結的第二部分
二、jfreechart作圖類對象的協調關系
jfreechart 的繪圖對象由一個org.jfree.chart.JFreeChart組成,但作為繪圖關鍵的Graphich2d通過 org.jfree.chart.render.*中的對應render類包裝後設入,換言之,開發者可以通過對基礎圖板Graphic的設置,完成必要的繪圖預定效果設計;而大多數的修改,實際上可以通過包裝的各個類操作而不用直接修改Graphic對象屬性(誰記得呢?)。jfreechart的數據接口由org.jfree.chart.plot.*中的不同的plot包裝,與之相對應的是不同的dataset,位於 org.jfree.chart.data.*中不同的dataset接口包裝。使用jfreechart作圖的關鍵在於生一個個相應的數據集對象,,然後包裝成對應的一個個繪圖集plot對象,最後再包裝成不同的JFreeChart對象交付輸出。通過new方法可以一步步完成上面的步驟。換言之, plot類是圖形的設計,render 是繪制的工具,而dataset則是填充的數據;這樣就把作圖的三個關鍵因素分別抽象成統一的接口,互想搭配出各種圖形。對於可能有多套數據集的圖表,如時間序列的多條曲線走勢圖(象幾只股票),傳入plot的不是數據集,而是數據集的集合,一般命名為某某collection。
通過 ChartFactory的不同方法生成不同的Chart類型,可以相應地縮小了由dataset對不同的chart對象的操作過程代碼量,直接獲得 chart對象。實際上是由工廠類代替用戶生成必要的render和plot類,如果用戶不想使用默認的設置,就需要再通過get方法得出相應的plot 對象進行修改。jfreechart的最後圖像輸出一般由org.jfree.chart.ChartUtilites完成,這個類可以向接定的 PrintWriter對象輸出完成的Chart對象。在服務器程序中,另一個ServerUtilites方法調用了這個方法,生成一個圖像臨時文件,並向JSP或servlet返回這個文件對象,通過把這個圖像的生命周期與session綁定,希望可以實現緩沖功能,降低服務器動態生成圖像的損耗。但是也有很大的問題其一就是如果session很長,就等於不能生成實時圖像,其二就是訪問的人多了,服務器的負擔似乎反而加大了。這個算法顯然有問題,倒不如修改成按時間更新一個圖像更為合適。
觀察代碼,兩者效果是一樣的:
A、工廠方法:
JFreeChart chart = ChartFactory.createPieChart3D( "2000 GDP分布比例圖", data, true, false, false );//指定獲得不同的實現chart對象,含有不同的plot繪圖對象 PiePlot plot = (PiePlot) chart.getPlot();//獲取plot對象用於修訂屬性,強制造型,以便調用各自的方法plot.setLabelGenerator(new StandardPIEItemLabelGenerator( "{0} = {2}", NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance() ));//設定注釋方式plot.setForegroundAlpha(0.5f);//設定透明度plot.setNoDataMessage("無記錄內容");//無記錄異常顯示
B、手工生成對象
PiePlot plot = new PIEPlot(dataset);
plot.setLabelGenerator(new StandardPIEItemLabelGenerator( "{0} = {2}", NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance() ));//設定注釋方式plot.setForegroundAlpha(0.5f);//設定透明度plot.setNoDataMessage("無記錄內容");//無記錄異常顯示
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);