1簡(jiǎn)介
JFreeChart是SourceForge.net上的一個(gè)開(kāi)源項(xiàng)目,它的源碼和API都可以免費(fèi)獲得。JFreeChart的功能非常強(qiáng)大,可以實(shí)現(xiàn)餅圖(二維和三維),柱狀圖(水平,垂直),線(xiàn)圖,點(diǎn)圖,時(shí)序圖,甘特圖,股票行情圖,混和圖,溫度計(jì)圖,刻度圖等常用商用圖表,圖形可以導(dǎo)出成PNG和JPEG格式,同時(shí)還可以與PDF和EXCEL關(guān)聯(lián),支持對(duì)圖形的放大、縮小,支持常見(jiàn)圖形的3D顯示。
2圖形對(duì)象的處理
2.1 JFreeChart對(duì)象
JFreeChart可以生成很多圖形對(duì)象,它的工廠(chǎng)類(lèi)提供了33個(gè)工廠(chǎng)方法用于生成不同的圖形對(duì)象(具體的工廠(chǎng)方法可以參見(jiàn)JFreeChart的API手冊(cè)或者源碼中的ChartFactory類(lèi))。JFreechart對(duì)圖形對(duì)象的抽象具體化。圖形對(duì)象(JFreeChart),由Title(主標(biāo)題),SubTitle(子標(biāo)題),Plot(圖形的繪制結(jié)構(gòu))等幾個(gè)主要對(duì)象組成。各個(gè)組成部分如下圖所示:
這是一個(gè)JFreeChart對(duì)象,上面的“chart標(biāo)題”是Title對(duì)象,中間區(qū)域是Plot對(duì)象(包括繪圖區(qū)域和坐標(biāo)軸區(qū)域),下面的區(qū)域是LegendTitle對(duì)象,LegendTitle是一種SubTitle對(duì)象。
每個(gè)JFreeChart對(duì)象只能有1個(gè)Title對(duì)象,1個(gè)Plot對(duì)象,可以有多個(gè)SubTitle對(duì)象。JFreeChart對(duì)象可以進(jìn)行的操作有:背景的設(shè)置(背景顏色、背景圖片、透明度等)、邊框的設(shè)置(是否可見(jiàn)、筆畫(huà)、Paint等)、渲染方式的設(shè)置、標(biāo)題對(duì)象的設(shè)置、子標(biāo)題對(duì)象的增刪查操作。(本文中的所有操作都不提供代碼級(jí)的介紹,可參見(jiàn)API手冊(cè)或者源碼)
2.2 主標(biāo)題對(duì)象
主標(biāo)題對(duì)象是TextTitle類(lèi)型,可以進(jìn)行的操作有:背景設(shè)置、字體設(shè)置(字體類(lèi)型、顏色、內(nèi)容、對(duì)齊方式等操作)、tooltip設(shè)置、URL設(shè)置。
2.3 Plot對(duì)象
Plot對(duì)象是圖形的繪制結(jié)構(gòu)對(duì)象。JFreeChart中含有很多不同的Plot對(duì)象,每一種圖形對(duì)象中的Plot對(duì)象都在實(shí)例化的時(shí)候創(chuàng)建。所有的Plot共有的操作有:背景設(shè)置(背景顏色、背景圖片、透明度等)、前景透明度設(shè)置、無(wú)數(shù)據(jù)存在情況的設(shè)置(顯示的字符內(nèi)容、顯示的字體、顯示的Paint)、放大縮小比例的設(shè)置,大部分Plot對(duì)象還有設(shè)置Datset、設(shè)置Renderer對(duì)象操作。
JFreeChart中有18種Plot抽象類(lèi)的具體實(shí)現(xiàn)類(lèi)。Plot的具體實(shí)現(xiàn)類(lèi)主要由以下重要對(duì)象組成:Renderer對(duì)象(圖形的繪制單元——繪圖域),Datset(圖形的數(shù)據(jù)源),DomainAxis(區(qū)域軸,相當(dāng)于x軸),RangeAxis(范圍軸,相當(dāng)于y軸)。
不同的Plot對(duì)象組成方式不盡相同,有的不含有Renderer對(duì)象,比如CompassPlot、ContourPlot、MultiplePiePlot、PiePlot等,有的不含有DomainAxis、RangeAxis對(duì)象,另外除了FastScatterPlot類(lèi)都含有Datset對(duì)象,FastScatterPlot使用float的二維數(shù)組充當(dāng)數(shù)據(jù)源。尤其說(shuō)明一點(diǎn),餅狀圖相關(guān)的Plot對(duì)象(MultiplePiePlot、PiePlot、PiePlot3D、RingPlot)中都不含有Renderer對(duì)象、DomainAxis對(duì)象、RangeAxis對(duì)象。
一般來(lái)說(shuō),Datset對(duì)象存儲(chǔ)數(shù)據(jù)模型,Renderer對(duì)象存儲(chǔ)顯示模型,Plot對(duì)象根據(jù)Datset對(duì)象、Renderer對(duì)象完成畫(huà)圖操作。
仍以上面的圖形講解Plot對(duì)象的組成。
上圖的中間區(qū)域是是一個(gè)XYPlot對(duì)象。其中的折線(xiàn)部分即是圖形的繪制單元Renderer對(duì)象。X軸是DomainAxis,y軸是RangeAxis,其中Datset對(duì)象屬于數(shù)據(jù)模型范疇,是UI不可見(jiàn)對(duì)象。該圖中的plot背景色、網(wǎng)格線(xiàn)的各種設(shè)置可以通過(guò)XYPlot對(duì)象本身完成。
下面講解Renderer對(duì)象、Axis對(duì)象(X軸、y軸都屬于Axis對(duì)象),Datset對(duì)象在后續(xù)章節(jié)中專(zhuān)門(mén)講解。
2.3.1 Renderer對(duì)象
Renderer對(duì)象是圖形的繪制單元。JFreeChart提供了兩個(gè)接口CategoryItemRenderer和XYItemRenderer、以及1個(gè)抽象類(lèi)AbstractRenderer供具體的Renderer類(lèi)實(shí)現(xiàn),給出了將近50種具體實(shí)現(xiàn)類(lèi)。
一般來(lái)說(shuō)Renderer對(duì)象可進(jìn)行的操作有:對(duì)itemlabel(下圖中的柱狀圖上的紅色數(shù)字即為itemlabel的示例)的默認(rèn)設(shè)置(itemlabel的產(chǎn)生方式、是否可見(jiàn)、字體、Paint、正反向itemlabel的位置設(shè)置等)、繪制圖形的邊框默認(rèn)設(shè)置(Paint、筆畫(huà)、是否可見(jiàn)等)、繪制圖形的默認(rèn)設(shè)置(形狀、筆畫(huà)、是否可見(jiàn)、對(duì)應(yīng)的圖例中是否可見(jiàn)等,折線(xiàn)圖還有線(xiàn)條是否可見(jiàn)、折點(diǎn)圖形是否可見(jiàn)、折點(diǎn)圖形是否填充、折點(diǎn)圖形的形狀、對(duì)應(yīng)的圖例中線(xiàn)條是否可見(jiàn)、圖形是否可見(jiàn)、整體是否可見(jiàn)等)、以及對(duì)指定itemlabel的設(shè)置、指定繪制圖形的設(shè)置。可以說(shuō)和具體繪制的圖形相關(guān)的屬性都可以通過(guò)Renderer對(duì)象設(shè)置。
不同的Renderer的實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)了不同的顯示方式,在含有Renderer對(duì)象的JFreeChart對(duì)象中,Renderer對(duì)象決定了JFreeChart對(duì)象的顯示方式。例如:柱狀圖的Plot對(duì)象中默認(rèn)的Renderer對(duì)象是CategoryItemRenderer對(duì)象,通過(guò)設(shè)置Plot對(duì)象的Renderer對(duì)象為LineAndShapeRenderer,則柱狀圖變?yōu)榫€(xiàn)圖。使用中一般不需要顯式的實(shí)例化一個(gè)Renderer對(duì)象,一般通過(guò)JFreeChart對(duì)象的Plot對(duì)象調(diào)用現(xiàn)有的Renderer對(duì)象進(jìn)行重新設(shè)置等操作。
2.3.2 Axis對(duì)象
JFreeChart提供了兩種類(lèi)型的坐標(biāo)軸:CategoryAxis(等級(jí)軸)和ValueAxis(值軸),ValueAxis又有3個(gè)子類(lèi):DateAxis(時(shí)間軸)、NumberAxis(數(shù)字軸)、PeriodAxis(時(shí)期軸)。這些坐標(biāo)軸還有更詳細(xì)的子類(lèi),不再一一列舉
Axis對(duì)象可進(jìn)行的操作有:標(biāo)題的設(shè)置(內(nèi)容、字體、Paint、顯示角度等)、坐標(biāo)線(xiàn)的設(shè)置(筆畫(huà)、Paint、是否可見(jiàn)等)、刻度線(xiàn)的設(shè)置(是否可見(jiàn)、筆畫(huà)、Paint、位于繪圖區(qū)域的長(zhǎng)度、位于繪圖區(qū)域外的長(zhǎng)度等)、刻度標(biāo)示的設(shè)置(筆畫(huà)、Paint、字體、與軸的距離等)、坐標(biāo)軸范圍設(shè)置等。
CategoryAxis對(duì)象還可以進(jìn)行的操作有:刻度標(biāo)示間距設(shè)置(最小間距、最大間距、指定間距)等。
ValueAxis對(duì)象可進(jìn)行的操作有:軸端設(shè)置(顯示的圖形形狀)、范圍設(shè)置(是否自動(dòng)產(chǎn)生范圍、自動(dòng)產(chǎn)生的最小范圍、最大范圍、指定確定范圍、指定范圍大小等)、間隔設(shè)置(是否自動(dòng)產(chǎn)生間隔、指定間隔)等。
DateAxis對(duì)象還有對(duì)時(shí)間刻度顯示格式的設(shè)置操作。
2.4 子標(biāo)題對(duì)象
子標(biāo)題對(duì)象是Title類(lèi)型的對(duì)象,一個(gè)JFreeChart可以有多個(gè)子標(biāo)題對(duì)象。JFreeChart提供了5種Title的實(shí)現(xiàn),可以是圖片、文本、圖例等的形式。
2.5數(shù)據(jù)源處理
JFreeChart中的數(shù)據(jù)源是DataSet接口類(lèi)型。該接口有三個(gè)主要的子類(lèi)接口:CategoryDataset、PieDataset、SeriesDataset
CategoryDataset接口的實(shí)現(xiàn)類(lèi)基本上都維護(hù)了一個(gè)三元組<value,row,col>的列表結(jié)構(gòu)。不同的實(shí)現(xiàn)類(lèi)中value的類(lèi)型不相同。<row,col>唯一確定一個(gè)三元組。CategoryDataset的實(shí)現(xiàn)類(lèi)提供對(duì)這個(gè)三元組的增刪改查操作。
PieDataset接口有兩個(gè)主要的實(shí)現(xiàn)類(lèi):CategoryToPieDataset、DefaultPieDataset。
SeriesDataset接口的實(shí)現(xiàn)類(lèi)基本上都維護(hù)了一種特定數(shù)據(jù)結(jié)構(gòu)的列表。以TimeSeriesCollection為例。它維護(hù)一個(gè)TimeSeries對(duì)象列表,提供對(duì)該列表的增刪查操作。每個(gè)TimeSeries對(duì)象維護(hù)一個(gè)<time,value>列表,提供對(duì)該列表的增刪改查操作。