Friday, October 24, 2008

夢想

抓不住夢想的尾巴,竟是如此的虛幻,
看不見未來的契機,竟是如此的灰心,
那幻、那空洞的思想,
原來只是,原來只是…
無謂的空想,沒有形式的失焦,
或許,你可以預見,
但你卻總是失去,
總是失去的比得到更多,不成比例,
所謂的等價交換,
也許只是一廂情願的一方。

五十音


日本的五十音並不是真的五十音@@"

瑞豐夜市


現在去夜市已經非常方便了,
只要作捷運到搞笑的巨蛋站稱呼…
下車後,往人多的地方走去就可以找到了,
所以說,有機會就去吃個東西吧。

樂透彩

感覺現在的樂透彩怎麼好像在鼓勵人賭博一樣,
每期都加碼,真的有這麼好賺嗎??
看來盈餘都不是拿去作公益,而是拿來賺更多窮人的錢,
感覺上就是好像銀行作弊,假如一直到月底都還是沒人中的話…
那麼很明顯的,真的是作弊,哪有每一次都這麼巧,
銀行變相叫人賭博就會一直加到最後一期才有人中,
而且中都是很多人同時中的,
這一定是作弊啦…
所以說跟簽金手指的樂透彩賭怎麼可能會贏呢??
只有輸的份吧。
不過最近好像有點背,昨天騎車騎到一半,車牌掉了,
到公司發現識別證沒帶,車子只好停外面,
晚上被警察攔下來,去吃飯又被燙到,之後又被刀子割到,
今天買了孔雀餅乾才發現有阿陸仔的傑作,
假如我去買樂透,應該是會一個都沒中吧…@@"

Thursday, October 23, 2008

趙壽山豬腳

滷豬腳

餛飩湯

在十月十號的那一週去了屏東里港玩了一下,午餐到這吃了豬腳與餛飩湯,
不過人真的還挺多的。

屁屁天罪二三話

這部布布,好像是專門用來清人的,
最近看了,七八集又清了紫宮太一,月漩渦,小狐,
而且任何人只要遇到棄天帝就只敗的一條路,
就連一頁書也是一掌就吐血了,三先天也都沒辦法,
這是怎麼一回事啊,強也強的太沒道理了吧,
假如有一個神,那麼就會有更多的神,
不然就沒意義了,感覺就只是大人在打小孩了,
假如棄天帝是來滅世的,那麼之前的嗜血者末世說,
還真的是笑話一場…佛劍的再出現,也是個笑話…

Sunday, October 12, 2008

回憶

當真愛已成為回憶而理想早已拋至雲霄,
那存在的意義就只剩下等待死亡的到來。
當生命已然枯竭而話語已成浪費奢侈,
那即使是一絲絲的憐憫,都成莫大的善行…
或許,留下的不是你的心,而是憐憫…

Tuesday, October 07, 2008

Java複製(Clone)的應用

簡介:

Java複製(Clone)是Java語言的特性之一,但在實際中應用比較少見。但有時候用複製會更方便更有效率。

對於複製(Clone),Java有一些限制:
1、被複製的類別必須自己實作Cloneable 介面,以指示 Object.clone() 方法可以合法地對該類別實例進行按字段複製。
Cloneable 介面實際上是個標識介面,沒有任何介面方法。
2、實作Cloneable介面的類別應該使用公共方法重寫 Object.clone(它是受保護的)。
某個物件實作了此介面就複製它是不可能的。即使 clone 方法是反射性使用的,也無法保證它將獲得成功。
3、在Java.lang.Object類別中複製方法是這麼定義的:
protected Object clone()
throws CloneNotSupportedException
建立並傳回此物件的一個副本。表明是一個受保護的方法,同一個pakage中可見。
按照慣例,傳回的物件應該通過使用 super.clone 獲得。


引題:

舉個例子說吧,現在有一個物件比如叫foo,你需要在建立當前物件的一個副本作為存根你能怎麼做?

假如你不用Clone,那麼你可以先new一個物件foo1:Foo foo1=new Foo(),
然後用foo給foo1物件set值,這樣就得到foo的副本foo1;除此之外,別無選擇。

這樣說,也許有人會覺得說的過於絕對了,不過事實如此啊。

要產生一個副本,那副本要不要記憶體?----當然要了,那就對了!
既然需要記憶體,(不複製的情況下)你不new還有什麼辦法呢?請大家時刻銘記物件是Java執行時產生的,駐留在計算機記憶體中。

常見錯誤:
下面我澄清幾個初學者容易犯迷糊的錯誤,同樣的問題,產生foo物件的副本:
1、Foo foo1=new Foo();
foo1=foo;
然後就想當然的認為副本foo1生成了!

錯誤原因:foo1沒錯是請求了記憶體,但是執行foo1=foo後,
foo1就不在指向剛請求的記憶體區域了,轉而指向foo物件的記憶體區域,
這時候,foo1、foo指向了同一記憶體區域。
剛才new的操作製造一堆垃圾等著JVM回收。

2、Foo foo1=foo;
錯誤原因:還是兩個變量都指向了同一塊記憶體。

3、有些老鳥更厲害一些:在Foo中定義一個傳回自身的方法:
public Foo getInstance(){
return this;
}

然後,Foo foo1=foo.getInstance();

錯誤原因:同上,主要還是沒有重新開闢記憶體,this在物件裡是什麼?
----就是物件自己的引用!那麼getInstance()自然傳回的就是物件自己,反正又是兩個物件穿了一條褲子

引入複製

看了這麼多方法都不行,還很麻煩!乾脆用複製吧,簡單明了。

廢話不說了,看例子:
定義兩個類別CloneFooA、CloneFooB,然後寫個測試類別CloneDemo分別複製這兩個類別的物件,然後印出測試結果到控制台。


/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-20
* Time: 19:40:44
* 簡單類別複製實作
* 要實作複製,必須實作Cloneable介面,這是一個標識介面,沒有介面方法
* 實作了 Cloneable 介面,以指示 Object.clone() 方法可以合法地對該類別實例進行按字段複製。
* 按照慣例,實作此介面的類別應該使用公共方法重寫 Object.clone(它是受保護的)。
*/
public class CloneFooA implements Cloneable {
private String strA;
private int intA;

public CloneFooA(String strA, int intA) {
this.strA = strA;
this.intA = intA;
}

public String getStrA() {
return strA;
}

public void setStrA(String strA) {
this.strA = strA;
}

public int getIntA() {
return intA;
}

public void setIntA(int intA) {
this.intA = intA;
}

/**
* @return 建立並傳回此物件的一個副本。
* @throws CloneNotSupportedException
*/
public Object clone() throws CloneNotSupportedException {
//直接使用父類別的clone()方法,傳回複製副本
return super.clone();
}
}


/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-20
* Time: 19:59:55
* 深度複製物件,當類別存在聚合關係的時候,複製就必須考慮聚合物件的複製
*/
public class CloneFooB implements Cloneable {
private CloneFooA fooA;
private double douB;

public CloneFooB(double douB) {
this.douB = douB;
}

public CloneFooB(CloneFooA fooA, double douB) {
this.fooA = fooA;
this.douB = douB;
}

public CloneFooA getFooA() {
return fooA;
}

public void setFooA(CloneFooA fooA) {
this.fooA = fooA;
}

public double getDouB() {
return douB;
}

public void setDouB(double douB) {
this.douB = douB;
}

/**
* 複製操作
*
* @return 自身物件的一個副本
* @throws CloneNotSupportedException
*/
public Object clone() throws CloneNotSupportedException {
//先使用父類別的複製方法進行複製操作
CloneFooB cloneFooB = (CloneFooB) super.clone();
//對於複製後出的物件cloneFooB,如果其成員fooA為null,則不能使用clone(),否則出Null Pointer異常
if (this.fooA != null)
cloneFooB.fooA = (CloneFooA) this.fooA.clone();

return cloneFooB;
}
}


/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-9-20
* Time: 19:52:01
* 測試類別:分別複製CloneFooA和CloneFooB類別,並印出複製前後的結果.
*/
public class CloneDemo {
public static void main(String args[]) throws CloneNotSupportedException {
//CloneFooA複製前
CloneFooA fooA1 = new CloneFooA("FooA", 11);
System.out.println("CloneFooA的物件複製前物件fooA1值為: " + fooA1.getStrA() + "," + fooA1.getIntA());
//CloneFooA複製後
CloneFooA fooA2 = (CloneFooA) fooA1.clone();
System.out.println("CloneFooA的物件複製後物件fooA2值為: " + fooA2.getStrA() + "," + fooA2.getIntA());
//比較fooA1和fooA2記憶體位址
if (fooA1 == fooA2) System.out.println("比較fooA1和fooA2記憶體位址:相等!");
else System.out.println("比較fooA1和fooA2記憶體位址:不相等!");

System.out.println("-------------------------");

//CloneFooB複製前
CloneFooB fooB1 = new CloneFooB(fooA1, new double("33"));
System.out.println("CloneFooB的物件複製前物件fooB1值為: " + fooB1.getFooA().getStrA() + "," + fooB1.getFooA().getIntA() + " | " + fooB1.getDouB());
//CloneFooB複製後
CloneFooB fooB2 = (CloneFooB) fooB1.clone();
System.out.println("CloneFooB的物件複製前物件fooB2值為: " + fooB2.getFooA().getStrA() + "," + fooB2.getFooA().getIntA() + " | " + fooB2.getDouB());

if (fooA1 == fooA2) System.out.println("比較fooB1和fooB2記憶體位址:相等!");
else System.out.println("比較fooB1和fooB2記憶體位址:不相等!");
}
}

執行結果:

CloneFooA的物件複製前物件fooA1值為: FooA,11
CloneFooA的物件複製後物件fooA2值為: FooA,11
比較fooA1和fooA2記憶體位址:不相等!
-------------------------
CloneFooB的物件複製前物件fooB1值為: FooA,11 | 33.0
CloneFooB的物件複製前物件fooB2值為: FooA,11 | 33.0
比較fooB1和fooB2記憶體位址:不相等!

Process finished with exit code 0


反面教材:

最後,我給出我上面提出到最後要給出的反面例子。

隨便寫一個,在CloneFooA 的基礎上做了少許改動,內容如下:

public class CloneFooA implements Cloneable {
private String strA;
private int intA;

public CloneFooA(String strA, int intA) {
this.strA = strA;
this.intA = intA;
}

public String getStrA() {
return strA;
}

public void setStrA(String strA) {
this.strA = strA;
}

public int getIntA() {
return intA;
}

public void setIntA(int intA) {
this.intA = intA;
}

/**
* @return 建立並傳回此物件的一個副本。
* @throws CloneNotSupportedException
*/
public Object clone() throws CloneNotSupportedException {
//直接使用父類別的clone()方法,傳回複製副本
return super.clone();
}

/**
* @return 傳回執行時的物件
*/
public CloneFooA getInstance(){
return this;
}

public static void main(String args[]){
CloneFooA fooA=new CloneFooA("aa",11);
System.out.println(fooA.getStrA()+" "+fooA.getIntA());

CloneFooA fooA1=fooA.getInstance();
System.out.println(fooA1.getStrA()+" "+fooA1.getIntA());
if(fooA==fooA1) System.out.println("fooA和fooA1記憶體位址相等!");

System.out.println("-------------------------");

//改變後fooA或者fooA1中任何一個,看看另外一個是否會改變
fooA1.setStrA("bb");
System.out.println(fooA.getStrA()+" "+fooA.getIntA());
System.out.println(fooA1.getStrA()+" "+fooA1.getIntA());

if(fooA==fooA1) System.out.println("fooA和fooA1記憶體位址相等,改變fooA1後,fooA的值也跟著變化了");
}
}

執行結果:

aa 11
aa 11
fooA和fooA1記憶體位址相等!
-------------------------
bb 11
bb 11
fooA和fooA1記憶體位址相等,改變fooA1後,fooA的值也跟著變化了

Process finished with exit code 0

Monday, October 06, 2008

JfreeChart(轉載)

JFreeChart目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面:

JFreeChart類別:
void setAntiAlias(boolean flag)字體模糊邊界
void setBackgroundImage(Image image)背景圖片
void setBackgroundImageAlignment(int alignment)背景圖片對齊方式(參數常量在org.jfree.ui.Align類別中定義)
void setBackgroundImageAlpha(float alpha)背景圖片透明度(0.0~1.0)
void setBackgroundPaint(Paint paint)背景色
void setBorderPaint(Paint paint)邊界線條顏色
void setBorderStroke(Stroke stroke)邊界線條筆觸
void setBorderVisible(boolean visible)邊界線條是否可見

-----------------------------------------------------------------------------------------------------------

TextTitle類別:
void setFont(Font font)標題字體
void setPaint(Paint paint)標題字體顏色
void setText(String text)標題內容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)類別:
void setBackgroundPaint(Paint paint)圖示背景色
void setTitle(String title)圖示標題內容
void setTitleFont(Font font)圖示標題字體
void setBoundingBoxArcWidth(int arcWidth)圖示邊界圓角寬
void setBoundingBoxArcHeight(int arcHeight)圖示邊界圓角高
void setOutlinePaint(Paint paint)圖示邊界線條顏色
void setOutlineStroke(Stroke stroke)圖示邊界線條筆觸
void setDisplaySeriesLines(boolean flag)圖示項是否顯示橫線(折線圖有效)
void setDisplaySeriesShapes(boolean flag)圖示項是否顯示形狀(折線圖有效)
void setItemFont(Font font)圖示項字體
void setItemPaint(Paint paint)圖示項字體顏色
void setAnchor(int anchor)圖示在圖表中的顯示位置(參數常量在Legend類別中定義)

Axis類別:
void setVisible(boolean flag)坐標軸是否可見
void setAxisLinePaint(Paint paint)坐標軸線條顏色(3D軸無效)
void setAxisLineStroke(Stroke stroke)坐標軸線條筆觸(3D軸無效)
void setAxisLineVisible(boolean visible)坐標軸線條是否可見(3D軸無效)
void setFixedDimension(double dimension)(用於復合表中對多坐標軸的設定)
void setLabel(String label)坐標軸標題
void setLabelFont(Font font)坐標軸標題字體
void setLabelPaint(Paint paint)坐標軸標題顏色
void setLabelAngle(double angle)`坐標軸標題旋轉角度(縱坐標可以旋轉)
void setTickLabelFont(Font font)坐標軸標尺值字體
void setTickLabelPaint(Paint paint)坐標軸標尺值顏色
void setTickLabelsVisible(boolean flag)坐標軸標尺值是否顯示
void setTickMarkPaint(Paint paint)坐標軸標尺顏色
void setTickMarkStroke(Stroke stroke)坐標軸標尺筆觸
void setTickMarksVisible(boolean flag)坐標軸標尺是否顯示

ValueAxis(Axis)類別:
void setAutoRange(boolean auto)自動設定資料軸資料範圍
void setAutoRangeMinimumSize(double size)自動設定資料軸資料範圍時資料範圍的最小跨度
void setAutoTickUnitSelection(boolean flag)資料軸的資料標籤是否自動確定(默認為true)
void setFixedAutoRange(double length)資料軸固定資料範圍(設定100的話就是顯示MAXVALUE到MAXVALUE-100那段資料範圍)
void setInverted(boolean flag)資料軸是否反向(默認為false)
void setLowerMargin(double margin)資料軸下(左)邊距
void setUpperMargin(double margin)資料軸上(右)邊距
void setLowerBound(double min)資料軸上的顯示最小值
void setUpperBound(double max)資料軸上的顯示最大值
void setPositiveArrowVisible(boolean visible)是否顯示正向箭頭(3D軸無效)
void setNegativeArrowVisible(boolean visible)是否顯示反向箭頭(3D軸無效)
void setVerticalTickLabels(boolean flag)資料軸資料標籤是否旋轉到垂直
void setStandardTickUnits(TickUnitSource source)資料軸的資料標籤(可以只顯示整數標籤,需要將AutoTickUnitSelection設false)

NumberAxis(ValueAxis)類別:
void setAutoRangeIncludesZero(boolean flag)是否強制在自動選擇的資料範圍中包含0
void setAutoRangeStickyZero(boolean flag)是否強制在整個資料軸中包含0,即使0不在資料範圍中
void setNumberFormatOverride(NumberFormat formatter)資料軸資料標籤的顯示格式
void setTickUnit(NumberTickUnit unit)資料軸的資料標籤(需要將AutoTickUnitSelection設false)

DateAxis(ValueAxis)類別:
void setMaximumDate(Date maximumDate)日期軸上的最小日期
void setMinimumDate(Date minimumDate)日期軸上的最大日期
void setRange(Date lower,Date upper)日期軸範圍
void setDateFormatOverride(DateFormat formatter)日期軸日期標籤的顯示格式
void setTickUnit(DateTickUnit unit)日期軸的日期標籤(需要將AutoTickUnitSelection設false)
void setTickMarkPosition(DateTickMarkPosition position)日期標籤位置(參數常量在org.jfree.chart.axis.DateTickMarkPosition類別中定義)

CategoryAxis(Axis)類別:
void setCategoryMargin(double margin)分類別軸邊距
void setLowerMargin(double margin)分類別軸下(左)邊距
void setUpperMargin(double margin)分類別軸上(右)邊距
void setVerticalCategoryLabels(boolean flag)分類別軸標題是否旋轉到垂直
void setMaxCategoryLabelWidthRatio(float ratio)分類別軸分類別標籤的最大寬度

AbstractRenderer類別:
void setItemLabelAnchorOffset(double offset)資料標籤的與資料點的偏移
void setItemLabelsVisible(boolean visible)資料標籤是否可見
void setItemLabelFont(Font font)資料標籤的字體
void setItemLabelPaint(Paint paint)資料標籤的字體顏色
void setItemLabelPosition(ItemLabelPosition position)資料標籤位置
void setPositiveItemLabelPosition(ItemLabelPosition position)正數標籤位置
void setNegativeItemLabelPosition(ItemLabelPosition position)負數標籤位置
void setOutLinePaint(Paint paint)圖形邊框的線條顏色
void setOutLineStroke(Stroke stroke)圖形邊框的線條筆觸
void setPaint(Paint paint)所有分類別圖形的顏色
void setShape(Shape shape)所有分類別圖形的形狀(如折線圖的點)
void setStroke(Stroke stroke)所有分類別圖形的筆觸(如折線圖的線)
void setSeriesItemLabelsVisible(int series,boolean visible)指定分類別的資料標籤是否可見
void setSeriesItemLabelFont(int series,Font font)指定分類別的資料標籤的字體
void setSeriesItemLabelPaint(int series,Paint paint)指定分類別的資料標籤的字體顏色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position)資料標籤位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position)正數標籤位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position)負數標籤位置
void setSeriesOutLinePaint(int series,Paint paint)指定分類別的圖形邊框的線條顏色
void setSeriesOutLineStroke(int series,Stroke stroke)指定分類別的圖形邊框的線條筆觸
void setSeriesPaint(int series,Paint paint)指定分類別圖形的顏色
void setSeriesShape(int series,Shape shape)指定分類別圖形的形狀(如折線圖的點)
void setSeriesStroke(int series,Stroke stroke)指定分類別圖形的筆觸(如折線圖的線)

AbstractCategoryItemRenderer(AbstractRenderer)類別:
void setLabelGenerator(CategoryLabelGenerator generator)資料標籤的格式
void setToolTipGenerator(CategoryToolTipGenerator generator)MAP中鼠標移上的顯示格式
void setItemURLGenerator(CategoryURLGenerator generator)MAP中鑽取鏈接格式
void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator)指定分類別的資料標籤的格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator)指定分類別的MAP中鼠標移上的顯示格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator)指定分類別的MAP中鑽取鏈接格式

BarRenderer(AbstractCategoryItemRenderer)類別:
void setDrawBarOutline(boolean draw)是否畫圖形邊框
void setItemMargin(double percent)每個BAR之間的間隔
void setMaxBarWidth(double percent)每個BAR的最大寬度
void setMinimumBarLength(double min)最短的BAR長度,避免數值太小而顯示不出
void setPositiveItemLabelPositionFallback(ItemLabelPosition position)無法在BAR中顯示的正數標籤位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position)無法在BAR中顯示的負數標籤位置

BarRenderer3D(BarRenderer)類別:
void setWallPaint(Paint paint)3D坐標軸的牆體顏色

StackedBarRenderer(BarRenderer)類別:
沒有特殊的設定

StackedBarRenderer3D(BarRenderer3D)類別:
沒有特殊的設定

GroupedStackedBarRenderer(StackedBarRenderer)類別:
void setSeriesToGroupMap(KeyToGroupMap map)將分類別自由的映射成若干個組(KeyToGroupMap.mapKeyToGroup(series,group))

LayeredBarRenderer(BarRenderer)類別:
void setSeriesBarWidth(int series,double width)設定每個分類別的寬度(注意設定不要使某分類別被覆蓋)

WaterfallBarRenderer(BarRenderer)類別:
void setFirstBarPaint(Paint paint)第一個柱圖的顏色
void setLastBarPaint(Paint paint)最後一個柱圖的顏色
void setPositiveBarPaint(Paint paint)正值柱圖的顏色
void setNegativeBarPaint(Paint paint)負值柱圖的顏色

IntervalBarRenderer(BarRenderer)類別:
需要傳IntervalCategoryDataset作為資料來源

GanttBarRenderer(IntervalBarRenderer)類別:
void setCompletePaint(Paint paint)完成進度顏色
void setIncompletePaint(Paint paint)未完成進度顏色
void setStartPercent(double percent)設定進度條在整條中的起始位置(0.0~1.0)
void setEndPercent(double percent)設定進度條在整條中的結束位置(0.0~1.0)

StatisticBarRenderer(BarRenderer)類別:
需要傳StatisticCategoryDataset作為資料來源

LineAndShapeRenderer(AbstractCategoryItemRenderer)類別:
void setDrawLines(boolean draw)是否折線的資料點之間用線連
void setDrawShapes(boolean draw)是否折線的資料點根據分類別使用不同的形狀
void setShapesFilled(boolean filled)所有分類別是否填充資料點圖形
void setSeriesShapesFilled(int series,boolean filled)指定分類別是否填充資料點圖形
void setUseFillPaintForShapeOutline(boolean use)指定是否填充資料點的Paint也被用於畫資料點形狀的邊框

LevelRenderer(AbstractCategoryItemRenderer)類別:
void setItemMargin(double percent)每個分類別之間的間隔
void setMaxItemWidth(double percent)每個分類別的最大寬度

CategoryStepRenderer(AbstractCategoryItemRenderer)類別:
void setStagger(boolean shouldStagger)不同分類別的圖是否交錯

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)類別:
void setDrawLines(boolean drawLines)是否在每個分類別線間畫連接線
void setGroupPaint(Paint groupPaint)一組圖形連接線的顏色
void setGroupStroke(Stroke groupStroke)一組圖形連接線的筆觸
void setMaxIcon(Icon maxIcon)最大值的ICON
void setMinIcon(Icon minIcon)最小值的ICON
void setObjectIcon(Icon objectIcon)所有值的ICON

AreaRender(AbstractCategoryItemRenderer)類別:
沒有特殊的設定

StackedAreaRender(AreaRender)類別:
沒有特殊的設定

關鍵就是用好Renderer這個類別了,再貼個例子:
String sFont = "宋體";
chart.setBorderVisible(true);
chart.setBorderPaint(new Color(0xFF,0x66,0x00));
chart.setBackgroundPaint(new Color(0xFF,0xF3,0xDE));
chart.getTitle().setPaint(Color.red);
chart.getTitle().setFont(new Font(sFont,Font.BOLD,14));

//設定Plot,不顯示所有網格
((CategoryPlot)chart.getPlot()).setOutlinePaint(null);
((CategoryPlot)chart.getPlot()).setDomainGridlinesVisible(false);
((CategoryPlot)chart.getPlot()).setRangeGridlinesVisible(false);

//設定橫軸字體,設定橫軸軸線不可見,隱藏縱軸
((CategoryPlot)chart.getPlot()).getDomainAxis().setTickLabelFont(new Font(sFont,Font.PLAIN,12));
((CategoryPlot)chart.getPlot()).getDomainAxis().setAxisLineVisible(false);
((CategoryPlot)chart.getPlot()).getRangeAxis().setVisible(false);

//採用BarRenderer作為表示器
BarRenderer renderer = new BarRenderer();
renderer.setPaint(new GradientPaint(0.0f,0.0f,Color.orange,0.0f,0.0f,Color.yellow));
renderer.setOutlinePaint(Color.orange);
renderer.setDrawBarOutline(true);

//在條中央顯示投票數值
renderer.setItemLabelAnchorOffset(-20.0f);
renderer.setLabelGenerator(new StandardCategoryLabelGenerator("{2}",new DecimalFormat()));
renderer.setPositiveItemLabelPosition(new ItemLabelPosition());
renderer.setItemLabelsVisible(true);


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類別:
void setAntiAlias(boolean flag) 字體模糊邊界
void setBackgroundImage(Image image) 背景圖片
void setBackgroundImageAlignment(int alignment) 背景圖片對齊方式(參數常量在org.jfree.ui.Align類別中定義)
void setBackgroundImageAlpha(float alpha) 背景圖片透明度(0.0~1.0)
void setBackgroundPaint(Paint paint) 背景色
void setBorderPaint(Paint paint) 邊界線條顏色
void setBorderStroke(Stroke stroke) 邊界線條筆觸
void setBorderVisible(boolean visible) 邊界線條是否可見

-----------------------------------------------------------------------------------------------------------

TextTitle類別:
void setFont(Font font) 標題字體
void setPaint(Paint paint) 標題字體顏色
void setText(String text) 標題內容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)類別:
void setBackgroundPaint(Paint paint) 圖示背景色
void setTitle(String title) 圖示標題內容
void setTitleFont(Font font) 圖示標題字體
void setBoundingBoxArcWidth(int arcWidth) 圖示邊界圓角寬
void setBoundingBoxArcHeight(int arcHeight) 圖示邊界圓角高
void setOutlinePaint(Paint paint) 圖示邊界線條顏色
void setOutlineStroke(Stroke stroke) 圖示邊界線條筆觸
void setDisplaySeriesLines(boolean flag) 圖示項是否顯示橫線(折線圖有效)
void setDisplaySeriesShapes(boolean flag) 圖示項是否顯示形狀(折線圖有效)
void setItemFont(Font font) 圖示項字體
void setItemPaint(Paint paint) 圖示項字體顏色
void setAnchor(int anchor) 圖示在圖表中的顯示位置(參數常量在Legend類別中定義)

-----------------------------------------------------------------------------------------------------------

Axis類別:
void setVisible(boolean flag) 坐標軸是否可見
void setAxisLinePaint(Paint paint) 坐標軸線條顏色(3D軸無效)
void setAxisLineStroke(Stroke stroke) 坐標軸線條筆觸(3D軸無效)
void setAxisLineVisible(boolean visible) 坐標軸線條是否可見(3D軸無效)
void setFixedDimension(double dimension) (用於復合表中對多坐標軸的設定)
void setLabel(String label) 坐標軸標題
void setLabelFont(Font font) 坐標軸標題字體
void setLabelPaint(Paint paint) 坐標軸標題顏色
void setLabelAngle(double angle)` 坐標軸標題旋轉角度(縱坐標可以旋轉)
void setTickLabelFont(Font font) 坐標軸標尺值字體
void setTickLabelPaint(Paint paint) 坐標軸標尺值顏色
void setTickLabelsVisible(boolean flag) 坐標軸標尺值是否顯示
void setTickMarkPaint(Paint paint) 坐標軸標尺顏色
void setTickMarkStroke(Stroke stroke) 坐標軸標尺筆觸
void setTickMarksVisible(boolean flag) 坐標軸標尺是否顯示

ValueAxis(Axis)類別:
void setAutoRange(boolean auto) 自動設定資料軸資料範圍
void setAutoRangeMinimumSize(double size) 自動設定資料軸資料範圍時資料範圍的最小跨度
void setAutoTickUnitSelection(boolean flag) 資料軸的資料標籤是否自動確定(默認為true)
void setFixedAutoRange(double length) 資料軸固定資料範圍(設定100的話就是顯示MAXVALUE到MAXVALUE-100那段資料範圍)
void setInverted(boolean flag) 資料軸是否反向(默認為false)
void setLowerMargin(double margin) 資料軸下(左)邊距
void setUpperMargin(double margin) 資料軸上(右)邊距
void setLowerBound(double min) 資料軸上的顯示最小值
void setUpperBound(double max) 資料軸上的顯示最大值
void setPositiveArrowVisible(boolean visible) 是否顯示正向箭頭(3D軸無效)
void setNegativeArrowVisible(boolean visible) 是否顯示反向箭頭(3D軸無效)
void setVerticalTickLabels(boolean flag) 資料軸資料標籤是否旋轉到垂直
void setStandardTickUnits(TickUnitSource source) 資料軸的資料標籤(可以只顯示整數標籤,需要將AutoTickUnitSelection設false)

NumberAxis(ValueAxis)類別:
void setAutoRangeIncludesZero(boolean flag) 是否強制在自動選擇的資料範圍中包含0
void setAutoRangeStickyZero(boolean flag) 是否強制在整個資料軸中包含0,即使0不在資料範圍中
void setNumberFormatOverride(NumberFormat formatter) 資料軸資料標籤的顯示格式
void setTickUnit(NumberTickUnit unit) 資料軸的資料標籤(需要將AutoTickUnitSelection設false)

DateAxis(ValueAxis)類別:
void setMaximumDate(Date maximumDate) 日期軸上的最小日期
void setMinimumDate(Date minimumDate) 日期軸上的最大日期
void setRange(Date lower,Date upper) 日期軸範圍
void setDateFormatOverride(DateFormat formatter) 日期軸日期標籤的顯示格式
void setTickUnit(DateTickUnit unit) 日期軸的日期標籤(需要將AutoTickUnitSelection設false)
void setTickMarkPosition(DateTickMarkPosition position) 日期標籤位置(參數常量在org.jfree.chart.axis.DateTickMarkPosition類別中定義)

CategoryAxis(Axis)類別:
void setCategoryMargin(double margin) 分類別軸邊距
void setLowerMargin(double margin) 分類別軸下(左)邊距
void setUpperMargin(double margin) 分類別軸上(右)邊距
void setVerticalCategoryLabels(boolean flag) 分類別軸標題是否旋轉到垂直
void setMaxCategoryLabelWidthRatio(float ratio) 分類別軸分類別標籤的最大寬度

-----------------------------------------------------------------------------------------------------------

Plot類別:
void setBackgroundImage(Image image) 資料區的背景圖片
void setBackgroundImageAlignment(int alignment) 資料區的背景圖片對齊方式(參數常量在org.jfree.ui.Align類別中定義)
void setBackgroundPaint(Paint paint) 資料區的背景圖片背景色
void setBackgroundAlpha(float alpha) 資料區的背景透明度(0.0~1.0)
void setForegroundAlpha(float alpha) 資料區的前景透明度(0.0~1.0)
void setDataAreaRatio(double ratio) 資料區佔整個圖表區的百分比
void setOutLinePaint(Paint paint) 資料區的邊界線條顏色
void setOutLineStroke(Stroke stroke) 資料區的邊界線條筆觸
void setNoDataMessage(String message) 沒有資料時顯示的消息
void setNoDataMessageFont(Font font) 沒有資料時顯示的消息字體
void setNoDataMessagePaint(Paint paint) 沒有資料時顯示的消息顏色

CategoryPlot(Plot)類別:
void setDataset(CategoryDataset dataset) 資料區的2維資料表
void setColumnRenderingOrder(SortOrder order) 資料分類別的排序方式
void setAxisOffset(Spacer offset) 坐標軸到資料區的間距
void setOrientation(PlotOrientation orientation) 資料區的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)
void setDomainAxis(CategoryAxis axis) 資料區的分類別軸
void setDomainAxisLocation(AxisLocation location) 分類別軸的位置(參數常量在org.jfree.chart.axis.AxisLocation類別中定義)
void setDomainGridlinesVisible(boolean visible) 分類別軸網格是否可見
void setDomainGridlinePaint(Paint paint) 分類別軸網格線條顏色
void setDomainGridlineStroke(Stroke stroke) 分類別軸網格線條筆觸
void setRangeAxis(ValueAxis axis) 資料區的資料軸
void setRangeAxisLocation(AxisLocation location) 資料軸的位置(參數常量在org.jfree.chart.axis.AxisLocation類別中定義)
void setRangeGridlinesVisible(boolean visible) 資料軸網格是否可見
void setRangeGridlinePaint(Paint paint) 資料軸網格線條顏色
void setRangeGridlineStroke(Stroke stroke) 資料軸網格線條筆觸
void setRenderer(CategoryItemRenderer renderer) 資料區的表示者(詳見Renderer組)
void addAnnotation(CategoryAnnotation annotation) 給資料區加一個註釋
void addRangeMarker(Marker marker,Layer layer) 給資料區加一個數值範圍區域

PiePlot(Plot)類別:
void setDataset(PieDataset dataset) 資料區的1維資料表
void setIgnoreNullValues(boolean flag) 忽略無值的分類別
void setCircular(boolean flag) 餅圖是否一定是正圓
void setStartAngle(double angle) 餅圖的初始角度
void setDirection(Rotation direction) 餅圖的旋轉方向
void setExplodePercent(int section,double percent) 抽取的那塊(1維資料表的分類別下標)以及抽取出來的距離(0.0~1.0),3D餅圖無效
void setLabelBackgroundPaint(Paint paint) 分類別標籤的底色
void setLabelFont(Font font) 分類別標籤的字體
void setLabelPaint(Paint paint) 分類別標籤的字體顏色
void setLabelLinkMargin(double margin) 分類別標籤與圖的連接線邊距
void setLabelLinkPaint(Paint paint) 分類別標籤與圖的連接線顏色
void setLabelLinkStroke(Stroke stroke) 分類別標籤與圖的連接線筆觸
void setLabelOutlinePaint(Paint paint) 分類別標籤邊框顏色
void setLabelOutlineStroke(Paint paint) 分類別標籤邊框筆觸
void setLabelShadowPaint(Paint paint) 分類別標籤陰影顏色
void setMaximumLabelWidth(double width) 分類別標籤的最大長度(0.0~1.0)
void setPieIndex(int index) 餅圖的索引(復合餅圖中用到)
void setSectionOutlinePaint(int section,Paint paint) 指定分類別餅的邊框顏色
void setSectionOutlineStroke(int section,Stroke stroke) 指定分類別餅的邊框筆觸
void setSectionPaint(int section,Paint paint) 指定分類別餅的顏色
void setShadowPaint(Paint paint) 餅圖的陰影顏色
void setShadowXOffset(double offset) 餅圖的陰影相對圖的水平偏移
void setShadowYOffset(double offset) 餅圖的陰影相對圖的垂直偏移
void setLabelGenerator(PieSectionLabelGenerator generator) 分類別標籤的格式,設定成null則整個標籤包括連接線都不顯示
void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠標移上的顯示格式
void setURLGenerator(PieURLGenerator generator) MAP中鑽取鏈接格式

PiePlot3D(PiePlot)類別:
void setDepthFactor(double factor) 3D餅圖的Z軸高度(0.0~1.0)

MultiplePiePlot(Plot)類別:
void setLimit(double limit) 每個餅圖之間的資料關聯(詳細比較複雜)
void setPieChart(JFreeChart pieChart) 每個餅圖的顯示方式(見JFreeChart類別個PiePlot類別)

-----------------------------------------------------------------------------------------------------------

AbstractRenderer類別:
void setItemLabelAnchorOffset(double offset) 資料標籤的與資料點的偏移
void setItemLabelsVisible(boolean visible) 資料標籤是否可見
void setItemLabelFont(Font font) 資料標籤的字體
void setItemLabelPaint(Paint paint) 資料標籤的字體顏色
void setItemLabelPosition(ItemLabelPosition position) 資料標籤位置
void setPositiveItemLabelPosition(ItemLabelPosition position) 正數標籤位置
void setNegativeItemLabelPosition(ItemLabelPosition position) 負數標籤位置
void setOutLinePaint(Paint paint) 圖形邊框的線條顏色
void setOutLineStroke(Stroke stroke) 圖形邊框的線條筆觸
void setPaint(Paint paint) 所有分類別圖形的顏色
void setShape(Shape shape) 所有分類別圖形的形狀(如折線圖的點)
void setStroke(Stroke stroke) 所有分類別圖形的筆觸(如折線圖的線)
void setSeriesItemLabelsVisible(int series,boolean visible) 指定分類別的資料標籤是否可見
void setSeriesItemLabelFont(int series,Font font) 指定分類別的資料標籤的字體
void setSeriesItemLabelPaint(int series,Paint paint) 指定分類別的資料標籤的字體顏色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 資料標籤位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正數標籤位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 負數標籤位置
void setSeriesOutLinePaint(int series,Paint paint) 指定分類別的圖形邊框的線條顏色
void setSeriesOutLineStroke(int series,Stroke stroke) 指定分類別的圖形邊框的線條筆觸
void setSeriesPaint(int series,Paint paint) 指定分類別圖形的顏色
void setSeriesShape(int series,Shape shape) 指定分類別圖形的形狀(如折線圖的點)
void setSeriesStroke(int series,Stroke stroke) 指定分類別圖形的筆觸(如折線圖的線)

AbstractCategoryItemRenderer(AbstractRenderer)類別:
void setLabelGenerator(CategoryLabelGenerator generator) 資料標籤的格式
void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠標移上的顯示格式
void setItemURLGenerator(CategoryURLGenerator generator) MAP中鑽取鏈接格式
void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分類別的資料標籤的格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分類別的MAP中鼠標移上的顯示格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分類別的MAP中鑽取鏈接格式

BarRenderer(AbstractCategoryItemRenderer)類別:
void setDrawBarOutline(boolean draw) 是否畫圖形邊框
void setItemMargin(double percent) 每個BAR之間的間隔
void setMaxBarWidth(double percent) 每個BAR的最大寬度
void setMinimumBarLength(double min) 最短的BAR長度,避免數值太小而顯示不出
void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 無法在BAR中顯示的正數標籤位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 無法在BAR中顯示的負數標籤位置

BarRenderer3D(BarRenderer)類別:
void setWallPaint(Paint paint) 3D坐標軸的牆體顏色

StackedBarRenderer(BarRenderer)類別:
沒有特殊的設定

StackedBarRenderer3D(BarRenderer3D)類別:
沒有特殊的設定

GroupedStackedBarRenderer(StackedBarRenderer)類別:
void setSeriesToGroupMap(KeyToGroupMap map) 將分類別自由的映射成若干個組(KeyToGroupMap.mapKeyToGroup(series,group))

LayeredBarRenderer(BarRenderer)類別:
void setSeriesBarWidth(int series,double width) 設定每個分類別的寬度(注意設定不要使某分類別被覆蓋)

WaterfallBarRenderer(BarRenderer)類別:
void setFirstBarPaint(Paint paint) 第一個柱圖的顏色
void setLastBarPaint(Paint paint) 最後一個柱圖的顏色
void setPositiveBarPaint(Paint paint) 正值柱圖的顏色
void setNegativeBarPaint(Paint paint) 負值柱圖的顏色

IntervalBarRenderer(BarRenderer)類別:
需要傳IntervalCategoryDataset作為資料來源

GanttBarRenderer(IntervalBarRenderer)類別:
void setCompletePaint(Paint paint) 完成進度顏色
void setIncompletePaint(Paint paint) 未完成進度顏色
void setStartPercent(double percent) 設定進度條在整條中的起始位置(0.0~1.0)
void setEndPercent(double percent) 設定進度條在整條中的結束位置(0.0~1.0)

StatisticBarRenderer(BarRenderer)類別:
需要傳StatisticCategoryDataset作為資料來源

LineAndShapeRenderer(AbstractCategoryItemRenderer)類別:
void setDrawLines(boolean draw) 是否折線的資料點之間用線連
void setDrawShapes(boolean draw) 是否折線的資料點根據分類別使用不同的形狀
void setShapesFilled(boolean filled) 所有分類別是否填充資料點圖形
void setSeriesShapesFilled(int series,boolean filled) 指定分類別是否填充資料點圖形
void setUseFillPaintForShapeOutline(boolean use) 指定是否填充資料點的Paint也被用於畫資料點形狀的邊框

LevelRenderer(AbstractCategoryItemRenderer)類別:
void setItemMargin(double percent) 每個分類別之間的間隔
void setMaxItemWidth(double percent) 每個分類別的最大寬度

CategoryStepRenderer(AbstractCategoryItemRenderer)類別:
void setStagger(boolean shouldStagger) 不同分類別的圖是否交錯

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)類別:
void setDrawLines(boolean drawLines) 是否在每個分類別線間畫連接線
void setGroupPaint(Paint groupPaint) 一組圖形連接線的顏色
void setGroupStroke(Stroke groupStroke) 一組圖形連接線的筆觸
void setMaxIcon(Icon maxIcon) 最大值的ICON
void setMinIcon(Icon minIcon) 最小值的ICON
void setObjectIcon(Icon objectIcon) 所有值的ICON

AreaRender(AbstractCategoryItemRenderer)類別:
沒有特殊的設定

StackedAreaRender(AreaRender)類別:
沒有特殊的設定

在線文檔:
http://www.jfree.org/jfreechart/api/javadoc/index.html