最近項目中用到一些圖標顯示,用的是JFreeChart 來做的。做完以後順便也總結下,方便以後使用中忘記。
一般的快速學習的話,看下Demo 能最快上手,所以我也採取這種形式。
項目首頁:http://www.jfree.org/jfreechart/
由於jfreechart 的文檔時收費的,不過google 的強大已經解決了。。哈哈。。有它的demo 的源碼和文檔
下面是一個時間曲線圖生成的Demo
package test.chart;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
public class JFreeChartDemo {
public static void main(String[] args) throws IOException {
JFreeChart chart = ChartFactory.createTimeSeriesChart("圖表標題", // 圖表標題
"目錄軸的顯示標籤",// 目錄軸的顯示標籤
"數值軸的顯示標籤",// 數值軸的顯示標籤
getDataSet(),// 數據集
true, // 是否顯示圖例
false, // 是否顯示工具提示
false);// 是否生成URL
// 重新設置圖表標題,改變字體
chart.setTitle(new TextTitle("重新設置圖表標題",
new Font("黑體", Font.ITALIC, 22)));
// 取得統計圖表的第一個圖例
LegendTitle legend = chart.getLegend(0);
// 修改圖例的字體
legend.setItemFont(new Font("宋體", Font.BOLD, 14));
// 取得時間順序圖的plot 對象
XYPlot plot = (XYPlot) chart.getPlot();
// 取得橫軸
ValueAxis categoryAxis = plot.getDomainAxis();
// 設置橫軸顯示標籤的字體
categoryAxis.setLabelFont(new Font("宋體", Font.BOLD, 22));
categoryAxis.setTickLabelFont(new Font("宋體", Font.BOLD, 18));
// 取得縱軸
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
// 設置縱軸的字體
numberAxis.setLabelFont(new Font("宋體", Font.BOLD, 22));
FileOutputStream fos = new FileOutputStream("c:/zhxing.jpg");
// 將圖表輸出成jpg 文件
ChartUtilities.writeChartAsJPEG(fos,// 輸出到哪個輸出流
1, // jpeg 圖片的質量,0~1之間
chart, // 統計圖表對象
800,// 長
600// 寬
);
fos.close();
System.out.println("end!");
}
private static XYDataset getDataSet() {
// 時間曲線圖1
TimeSeries s1 = new TimeSeries("時間順序圖1");
// 該Month 爲JFreeChart 自己實現的Month 類,還有其他Day、Year 等,可查看源碼得知
s1.add(new Month(1, 2009), 400);
s1.add(new Month(2, 2009), 500);
s1.add(new Month(3, 2009), 200);
// 時間曲線圖2
TimeSeries s2 = new TimeSeries("時間順序圖2");
s2.add(new Month(1, 2009), 3700);
s2.add(new Month(2, 2009), 3800);
s2.add(new Month(3, 2009), 2900);
// 用TimeSeriesCollection 來保存多條時間曲線
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(s1);
dataset.addSeries(s2);
return dataset;
}
}
上面的Dome 是參照了struts2 權威指南上的,還有一些圖例顯示,將在以後再添加進來。。。
看了幾個圖例的生成,可以總結下大概的步驟:
1、用CharFactory 工廠生成相應的圖例,其構造方法基本有些類似。
2、可以重新設置標題(可以發現凡是有文字顯示的通常可以設置字體的風格和大小)
3、獲取相應的圖例對象
4、設置圖例對象的一些屬性,如字體等。
5、用ChartUtilities可以將圖例生成在文件中。
而生成數據階段則對象生成相應的對象,然後添加數據就可以了。。
在struts2 的項目上,可以參看下面的Demo
public class Struts2Demo extends ActionSupport{
private JFreeChart chart;
//獲取的action方法
public String LoadChart() throws IOException{
chart=this.gainChart();
return SUCCESS;
}
/**
* 獲得圖例對象
*/
private JFreeChart gainChart() throws IOException{
JFreeChart chart=ChartFactory.createXXXChart(
"",
"",
getDataSet(resultYear,workerid),
true,
false,
false);
//other code
return chart;
}
//返回一個XXXXDataSet實例
private XXXDataset getDataSet(){
// other code
}
public JFreeChart getChart() {
return chart;
}
}
<package name="demo" extends="jfreechart-default"> <action name="Struts2Demo" class="Struts2Demo" method="LoadChart"> <result type="chart"> <param name="width">800</param> <param name="height">600</param> </result> </action> </package>
當然要加上Struts2 中的jfreechart 的插件包
由於時間不夠,先記錄下這些,以後補充。。