Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          WWW的發(fā)展使得基于因特網(wǎng)的應(yīng)用程序不再局限于靜態(tài)或者簡單的動態(tài)內(nèi)容提供。傳統(tǒng)的一些以軟件包形式發(fā)布應(yīng)用程序例如報表系統(tǒng)等都在逐漸搬到因特網(wǎng)上。但是這兩者之間有著天壤之別,雖然對于數(shù)據(jù)獲取、業(yè)務(wù)處理等方面基本類似,但是最大的差別在于用戶界面。為了能在web瀏覽器上顯示要求用戶界面使用HTML以及圖片的方式來展現(xiàn)數(shù)據(jù),而傳統(tǒng)的一些利用操作系統(tǒng)本身的控件來開發(fā)的用戶界面無法適應(yīng)琳瑯滿目的客戶端,因此在這里也變得無能為力。回到本文的題目上來,為了創(chuàng)建一個可以在web瀏覽器上查看到圖表一般有兩種做法:第一種就是使用applet利用java本身對圖形的支持來顯示一個圖表;第二種就是直接在web服務(wù)器端生成好圖表圖片文件后發(fā)送給瀏覽器。第一種方式顯然對于客戶端要求太高,隨著現(xiàn)在主流瀏覽器放棄對JAVA的支持后,這種方式只適合一些局域網(wǎng)的應(yīng)用,而對于因特網(wǎng)的環(huán)境就顯得不太適合。因此我們下面將介紹一個JAVA的圖表引擎JFreeChart用來產(chǎn)生基于WEB的圖表。
            
            一、JFreeChart項目簡介
            JFreeChart是開放源代碼站點SourceForge.net上的一個JAVA項目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區(qū)域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。這些不同式樣的圖表基本上可以滿足目前的要求。為了減少篇幅本文主要介紹前面三種類型的圖表,讀者可以觸類旁通去開發(fā)其他樣式的圖表。下面幾個是JFreeChart產(chǎn)生的這三種類型圖表的結(jié)果:
            
           

            
          圖1

            
           

            
          圖2

            
           

            
          圖3

            上面的三個圖都是表示四個季度的某個產(chǎn)品的銷量信息。在繼續(xù)下面小節(jié)之前必須先準備好開發(fā)環(huán)境,因為是基于WEB瀏覽器的圖表展現(xiàn),因此需要一個Servlet引擎或者是J2EE應(yīng)用服務(wù)器(例如WebSphere,Tomcat等)。WEB環(huán)境的搭建就不累贅了,讀者根據(jù)喜好自行安裝。JFreeChart引擎本身需要到SourceForge.net上下載,地址如下:
            JFreeChart主頁:http://www.jfree.org/jfreechart/index.html
            JFreeChart下載頁面:http://sourceforge.net/projects/jfreechart/
            
            下載的時候需要注意的是必須下載兩個文件:JFreeChart以及Jcommon。目前最新配套版本是:JFreeChart 0.9.11 Jcommon 0.8.6
            
            這里有點筆者在開發(fā)中遇見的問題需要注意的是:在使用Eclipse開發(fā)的時候會報一個莫名其妙的錯誤,錯誤可能指向某個類文件的第一行。遇到這樣的問題一般是因為沒有把Jcommon的jar包設(shè)置到項目的類路徑中的緣故。具體的原因不祥。 (還有l(wèi)og4j等也咬一起導(dǎo)入)。
            
            二、解讀JFreeChart的源碼結(jié)構(gòu)
            在開始使用JFreeChart之前我們有必要先大概了解一下JFreeChart本身的結(jié)構(gòu)以及它所帶一些例子程序,這樣有助于我們下一步自行開發(fā)。下載JFreeChart包后已經(jīng)帶有非常豐富的例子,因為JFreeChart這個項目本身的使用文檔非常少,因此學(xué)習(xí)它最好的辦法就是學(xué)習(xí)它所帶的例子源碼。在包org.jfree.chart.demo中有幾十個文件用于展示JFreeChart所能支持的所有圖表的結(jié)果。如果你的JDK是比較新的情況下可能在運行這些例子時會有問題,現(xiàn)象如下:
            
            java.lang.UnsatisfiedLinkError: initDDraw
             at sun.awt.windows.Win32OffScreenSurfaceData.initDDraw(Native Method)
             at sun.awt.windows.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(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>(JFrame.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"
            
            這個錯誤是由于新版的Swing大量的使用了微軟的DirectDraw的技術(shù)來提高畫圖的性能,而可能你的顯卡在這時候會跟你鬧點情緒或者顯卡本身并不支持這樣的一個技術(shù)。難道就沒有辦法了嘛?要解決這個問題也非常簡單,我們可以屏蔽掉DirectDraw,不讓Swing使用該技術(shù)就可以了。在運行這些代碼時給虛擬機指定參數(shù)-Dsun.java2d.noddraw即可。
            
            這時可能你又該納悶了,不說是基于Web的圖表嘛,怎么又扯到Swing上了?這是因為為了使開發(fā)者容易上手,無需配置任何運行環(huán)境,所以這些例子都是基于GUI方式的用于展現(xiàn)給開發(fā)者如果生成一個圖表,我們要學(xué)習(xí)的也就是如何利用這個引擎生成圖表而不是怎么來顯示一個圖表。當我們把生成的圖表對象Export到一個圖像文件即可在Web上發(fā)布。
            
            下面我們來介紹JFreeChart中幾個核心的對象類:
            <table boder=0>
            <tr><td>類名</td><td>類的作用以及簡單描述</td></tr>
            <tr><td>JFreeChart</td><td>圖表對象,任何類型的圖表的最終表現(xiàn)形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創(chuàng)建不同類型的圖表對象</td></tr>
            <tr><td>XXXXXDataset</td><td>數(shù)據(jù)集對象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對應(yīng)著很多類型的數(shù)據(jù)集對象類</td></tr>
            <tr><td>XXXXXPlot</td><td> 圖表區(qū)域?qū)ο螅旧线@個對象決定著什么樣式的圖表,創(chuàng)建該對象的時候需要Axis、Renderer以及數(shù)據(jù)集對象的支持</td></tr>
            <tr><td>XXXXXAxis</td><td> 用于處理圖表的兩個軸:縱軸和橫軸</td></tr>
            <tr><td>XXXXXRenderer</td><td>負責(zé)如何顯示一個圖表對象</td></tr>
            <tr><td>XXXXXURLGenerator</td><td> 用于生成Web圖表中每個項目的鼠標點擊鏈接</td></tr>
            <tr><td>XXXXXToolTipGenerator</td><td> 用于生成圖象的幫助提示,不同類型圖表對應(yīng)不同類型的工具提示類</td></tr>
            </table>
            
            基本上我認為JFreeChart項目本身的類結(jié)構(gòu)的設(shè)計并不是很好,首先在創(chuàng)建圖表的時候用到了大量的工廠方法,這樣做雖然可以簡化創(chuàng)建圖表對象的代碼,但是對項目本身或者開發(fā)人員來講自行擴展一種新的圖表都仍然是一件很麻煩的事情;其次除圖表對象本身外其余的類過于復(fù)雜,使用者必須去了解每個類型的圖表對象應(yīng)該對應(yīng)哪些Axis、Plot、Renderer類,并且必須非常熟悉這些類的構(gòu)造函數(shù)中每個參數(shù)的具體含義。這些問題都大大困擾很多初學(xué)者。不過,雖然存在很多問題,但是JFreeChart本身仍不失為一個非常優(yōu)秀的圖表引擎,況且項目本身也在逐漸的發(fā)展中。
            
            在非常簡略的介紹了JFreeChart本身的代碼結(jié)構(gòu)后,下面我們開始動手試驗幾個常用的圖表并把他們放到web上。
            
            三、使用JFreeChart生成各種樣式的圖表
            限于篇幅的問題我們在這里只實現(xiàn)兩種常用的圖表,其他類型圖表讀者可以觸類旁通。我們先給出柱狀圖的實現(xiàn),餅圖的實現(xiàn)再來跟柱狀圖進行比較。
            1 柱狀圖
            
            [code]package lius.chart.demo;
            
            import java.io.*;
            
            import org.jfree.data.*;
            import org.jfree.chart.*;
            import org.jfree.chart.plot.*;
            /**
             * 該類用于演示最簡單的柱狀圖生成
             * @author Winter Lau
             */
            public class BarChartDemo {
            
             public static void main(String[] args) throws IOException{
            
             CategoryDataset dataset = getDataSet2();
             JFreeChart chart = ChartFactory.createBarChart3D(
              "水果產(chǎn)量圖", // 圖表標題
              "水果", // 目錄軸的顯示標簽
              "產(chǎn)量", // 數(shù)值軸的顯示標簽
              dataset, // 數(shù)據(jù)集
              PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
              true, // 是否顯示圖例(對于簡單的柱狀圖必須是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();
            } catch (Exception e) {}
             }
             }
             /**
             * 獲取一個演示用的簡單數(shù)據(jù)集對象
             * @return
             */
             private static CategoryDataset getDataSet() {
             DefaultCategoryDataset dataset = new DefaultCategoryDataset();
             dataset.addvalue(100, null, "蘋果");
             dataset.addvalue(200, null, "梨子");<
          posted on 2007-09-11 10:17 禮物 閱讀(400) 評論(0)  編輯  收藏 所屬分類: 報表
          主站蜘蛛池模板: 乌拉特中旗| 郧西县| 甘南县| 宜春市| 隆德县| 信丰县| 湄潭县| 荃湾区| 杭州市| 江津市| 曲水县| 油尖旺区| 南阳市| 荣昌县| 岳阳市| 巩义市| 新宁县| 沅陵县| 临泉县| 扎鲁特旗| 阿瓦提县| 左贡县| 浠水县| 寿阳县| 嘉义市| 莱芜市| 汤原县| 娱乐| 临海市| 喜德县| 林口县| 古丈县| 南木林县| 海宁市| 宜城市| 会宁县| 突泉县| 休宁县| 庐江县| 黎城县| 清流县|