Monday, June 13, 2005

JAVAFREECHART對象關系

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);

0 Comments:

Post a Comment

<< Home