廉頗老矣,尚能飯否

          java:從技術到管理

          常用鏈接

          統計

          最新評論

          JFreeChart學習筆記[轉載]

          WWW的發展使得基于因特網的應用程序不再局限于靜態或者簡單的動態內容提供。傳統的一些以軟件包形式發布應用程序例如報表系統等都在逐漸搬到因特網上。但是這兩者之間有著天壤之別,雖然對于數據獲取、業務處理等方面基本類似,但是最大的差別在于用戶界面。為了能在web瀏覽器上顯示要求用戶界面使用HTML以及圖片的方式來展現數據,而傳統的一些利用操作系統本身的控件來開發的用戶界面無法適應琳瑯滿目的客戶端,因此在這里也變得無能為力。回到本文的題目上來,為了創建一個可以在web瀏覽器上查看到圖表一般有兩種做法:第一種就是使用applet利用java本身對圖形的支持來顯示一個圖表;第二種就是直接在web服務器端生成好圖表圖片文件后發送給瀏覽器。第一種方式顯然對于客戶端要求太高,隨著現在主流瀏覽器放棄對JAVA的支持后,這種方式只適合一些局域網的應用,而對于因特網的環境就顯得不太適合。因此我們下面將介紹一個JAVA的圖表引擎JFreeChart用來產生基于WEB的圖表。

          JFreeChart項目簡介
          JFreeChart是開放源代碼站點SourceForge.net上的一個JAVA項目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。

          一、JFreeChart獲取。
          JFreeChart是JFreeChart公司在開源網站SourceForge.net上的一個項目,該公司的主要產品有如下:
          1、JFreeReport:報表解決工具
          2、JFreeChart:Java圖形解決方案(Application/Applet/Servlet/Jsp)
          3、JCommon:JFreeReport和JFreeChart的公共類庫
          4、JFreeDesigner:JFreeReport的報表設計工具
          獲取地址:
          http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹)
          二、JFreeChart配置安裝
          1、解壓jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源碼,jfreechart-0.9.21-demo.jar
          是例子程序(該部分留給大家自己去研究)
          2、為了配置成功,我們需要關注的文件有如下三個:jfreechart-0.9.21.jar、libjcommon-0.9.6.jar、
          libgnujaxp.jar
          3、如果是Application開發,把上述三個文件拷貝到%JAVA_HOME%LIB中,同時在環境變量CLASSPATH中加入
          如果是WEB開發,以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
          (態圖表,餅圖(二維和三維) , 柱狀圖 (水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表)
          圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關聯

          JFreeChart核心類庫介紹:
          研究jfreechart源碼發現源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
          本身有關,后者與圖形顯示的數據有關。具體研究如果大家有興趣的話可以自己研究,以后有時間我會告訴大家怎么去
          研究源碼。
          核心類主要有:
          org.jfree.chart.JFreeChart:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創建不同類型的圖表對象
          org.jfree.data.category.XXXDataSet:數據集對象,用于提供顯示圖表所用的數據。根據不同類型的圖表對應著很多類型的數據集對象類
          org.jfree.chart.plot.XXXPlot:圖表區域對象,基本上這個對象決定著什么樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持
          org.jfree.chart.axis.XXXAxis:用于處理圖表的兩個軸:縱軸和橫軸
          org.jfree.chart.render.XXXRender:負責如何顯示一個圖表對象
          org.jfree.chart.urls.XXXURLGenerator:用于生成Web圖表中每個項目的鼠標點擊鏈接
          XXXXXToolTipGenerator:用于生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類

          下面我們來介紹JFreeChart中幾個核心的對象類:

          類名 類的作用以及簡單描述
          JFreeChart 圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創建不同類型的圖表對象
          XXXXXDataset 數據集對象,用于提供顯示圖表所用的數據。根據不同類型的圖表對應著很多類型的數據集對象類
          XXXXXPlot 圖表區域對象,基本上這個對象決定著什么樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持
          XXXXXAxis 用于處理圖表的兩個軸:縱軸和橫軸
          XXXXXRenderer 負責如何顯示一個圖表對象
          XXXXXURLGenerator 用于生成Web圖表中每個項目的鼠標點擊鏈接
          XXXXXToolTipGenerator 用于生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類

           

          高級主題

          很多情況我們不僅僅要求可以在瀏覽器上顯示一個圖表,我們更需要客戶可以直接在圖表上做一下交互的操作,例如獲取信息提示,點擊圖表某個部分進行更詳細信息的展示等等。例如前面生成的簡單柱狀圖,用戶需要在看到柱狀圖后點擊某種水果例如是蘋果即可看到各個地區蘋果產量的情況。為此就要求該圖形具有交互操作的功能。在HTML中為了讓一個圖像具有可交互的功能就必須給該圖像定義一個Map對象。下表節選一段具有該功能的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>
                      

          由此就產生了一個問題:如果根據一個圖像來生成對應的MAP對象。我們回頭看看剛才的代碼,在創建一個圖表對象時候有兩個參數,我們舉柱狀圖的例子來講這兩個參數就是ChartFactory. createBarChart3D方法中的最后兩個參數,這兩個參數的類型都是布爾值。這兩個參數意思分別是:是否創建工具提示(tooltip)以及是否生成URL。這兩個參數分別對應著MAP中一個AREA的title屬性以及href屬性。

          可是我想知道的是怎么來產生這個MAP??!哈哈,不要著急,JFreeChart已經幫我們做好生成MAP對象的功能。為了生成MAP對象就要引入另外一個對象:ChartRenderingInfo。因為JFreeChart沒有直接的方法利用一個圖表對象直接生成MAP數據,它需要一個中間對象來過渡,這個對象就是ChartRenderingInfo。下圖是生成MAP數據的流程圖:


          圖7

          如上圖所示,ChartUtilities類是整個流程的核心,它周圍的對象都是一些例如數據對象或者是文件等。這個流程簡單描述如下:首先創建一個ChartRenderingInfo對象并在調用ChartUtilities的writeChartAsJPEG時作為最后一個參數傳遞進去。調用該方法結束后將產生一個圖像文件以及一個填充好MAP數據的ChartRenderingInfo對象,有了這個對象我們還是沒有辦法獲取具體的MAP數據,我們還必須借助于ChartUtilities的writeImageMap方法來將ChartRenderingInfo對象讀取出來,獲取MAP數據的代碼片斷如下:
          		PrintWriter w = null;
                      FileOutputStream fos_jpg = null;
                      FileOutputStream fos_cri = null;
                      try{
                      //根據不同類型的圖表使用不同類,以下是針對餅圖的操作
                      PiePlot plot = (PiePlot) chart.getPlot();
                      plot.setURLGenerator(new StandardPieURLGenerator(url));
                      //設置工具提示
                      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,文件的內容就是要寫到頁面上的MAP數據。把生成的圖像文件以及MAP數據文件寫到頁面上即可完成熱點圖表的功能。至于怎么結合兩者之間的關系例如圖像的useMap屬性值必須與MAP對象的名稱結合起來,必須根據實際的應用情況進行相應的處理。筆者建議把二者通過標簽庫封裝起來,圖像文件的名稱以及MAP對象的名稱由標簽庫統一進行控制,這樣可以保證二者的一致性。



          柳德才
          13691193654
          18942949207
          QQ:422157370
          liudecai_zan@126.com
          湖北-武漢-江夏-廟山

          posted on 2009-01-09 02:20 liudecai_zan@126.com 閱讀(962) 評論(0)  編輯  收藏 所屬分類: JFreeChart

          主站蜘蛛池模板: 孝昌县| 黄大仙区| 承德市| 海林市| 内乡县| 滦平县| 沾化县| 来宾市| 平塘县| 织金县| 札达县| 海口市| 东海县| 麻阳| 中江县| 临城县| 九江市| 银川市| 绥化市| 天等县| 清徐县| 无为县| 团风县| 康马县| 稷山县| 巴彦淖尔市| 沂源县| 延庆县| 丰城市| 郑州市| 周口市| 青岛市| 泰安市| 阿拉善右旗| 黑水县| 汉源县| 罗田县| 天津市| 富顺县| 姜堰市| 琼中|