JFreeChart 是一個非常流行的一個免費開源的圖表軟件
已經有8年以上的歷史
首先要下載jar包
www.jfree.org
在http://www.jfree.org/jfreechart 下點擊Project Page at SourceForge 去下載
要下載JFreeChart 與JCommon
把jfreechart-1.0.9.jar與jcommon-1.0.12.jar加入到系統中
做JFreeChart的時候,一般是以下三步
1:要有數據 比如DefaultPieDataset
2:根據數據生成 JFreeChart 對象
3:顯示JFreeChart對象(顯示在swing中或生成一個圖片在jsp中顯示)
一:體驗下JFreeChart的強大功能(讀javadoc文檔 一個最重要的類JFreeChart)
package com.test.jfreechart
public class JFreeChartTest{
public static void main(String []args){
//首先要有數據(Dataset數據集)
DefaultPieDataset dpd=new DefaultPieDataset();
//setValue(Comparable key ,double value);
//字符串實現了Comparable接口
dpd.setValue("管理人員",25);
dpd.setValue("市場人員",25);
dpd.setValue("開發人員",45);
dpd.setValue("其他人員",10);
//然后把數據放入到JFreeChart 中
//創建一個平面圖形
JFreeChart chart=CharFactory.createPieChart("某公司人員組織結構圖",dbp,true,false,false);
//JFreeChart chart=CharFactory.createPieChart3D("某公司人員組織結構圖",dbp,true,false,false);
//通過swing顯示出來
ChartFrame frame=new ChartFrame("標題",chart);
frame.pack();
frame.setVisible(true);
}
}
上面會顯示一個餅狀圖,一般來說,圖形有3部分組成
1:標題
2:中間的圖形(叫plot)
3:底部有個說明什么顏色表示什么數據(legend)
package com.test.jfreechart
//ApplicationFrame 是屬于Jcommon中的
public class JFreeChartTest2 extends ApplicationFrame{ 柱狀圖
public JFreeChartTest2(String title)
{
super(title);
this.setContentPane(createPanel());
}
public static CategoryDataset createDataset()
{
//默認柱狀圖數據集 Category(柱狀)
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//setValue(double value,Comparable rowKey,Comparable columnKey)
dataset.setValue(10, "aa", "管理人員");
dataset.setValue(20, "bb", "市場人員");
dataset.setValue(40, "cc", "開發人員");
dataset.setValue(15, "dd", "其他人員");
return dataset;
}
//把數據加到chart 圖表中
public static JFreeChart createChart(CategoryDataset dataset)
{
JFreeChart chart = ChartFactory.createBarChart3D("hello", "人員分布", "人員數量",
dataset, PlotOrientation.VERTICAL, true, false, false);
chart.setTitle(new TextTitle("某公司組織結構圖", new Font("宋體", Font.BOLD
+ Font.ITALIC, 20)));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setLabelFont(new Font("微軟雅黑", Font.BOLD, 12));
return chart;
}
public static JPanel createPanel()
{
JFreeChart chart = createChart(createDataset());
return new ChartPanel(chart);
}
public static void main(String[] args)
{
JFreeChartTest2 chart = new JFreeChartTest2("某公司組織結構圖");
chart.pack();
chart.setVisible(true);
}
}
二:上面都是在swing中生成的圖形,我們在web程序里面怎么做呢
下面把JFreeChart 生成一個圖片,那么在web程序中就可以調用這個圖片了
public class JFreeChartTest3
{
public static void main(String[] args) throws Exception
{
JFreeChart chart = ChartFactory.createPieChart("某公司組織結構圖",
getDataset(), true, false, false);
chart.setTitle(new TextTitle("某公司組織結構圖", new Font("宋體", Font.BOLD,22)));
LegendTitle legend = chart.getLegend(0);
legend.setItemFont(new Font("微軟雅黑", Font.BOLD, 14));
PiePlot plot = (PiePlot) chart.getPlot();
plot.setLabelFont(new Font("隸書", Font.BOLD, 16));
//通過輸出流把圖形 創建為一個圖片
OutputStream os = new FileOutputStream("company.jpeg");
//將chart 輸出到os中,寬為1000,高為800
ChartUtilities.writeChartAsJPEG(os, chart, 1000, 800);
os.close();
}
private static DefaultPieDataset getDataset()
{
DefaultPieDataset dpd = new DefaultPieDataset();
dpd.setValue("管理人員", 25);
dpd.setValue("市場人員", 25);
dpd.setValue("開發人員", 45);
dpd.setValue("其他人員", 10);
return dpd;
}
}
三:如何在jsp中顯示JFreeChart生成的圖片
org.jfree.chart.servlet.DisplayChart
這是一個servlet,這個Servlet會作為一個流把圖片輸出到客戶端
要使用DisplayChart 那么在web.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>/DisplayChart</url-pattern>
</servlet-mapping>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory
,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<%
DefaultPieDataset dpd = new DefaultPieDataset();
dpd.setValue("管理人員", 25);
dpd.setValue("市場人員", 25);
dpd.setValue("開發人員", 45);
dpd.setValue("其他人員", 10);
JFreeChart chart = ChartFactory.createPieChart3D("某公司組織結構圖",dpd, true, false, false);
//ServletUtilities 能幫助生成圖片對象
String fileName = ServletUtilities.saveChartAsPNG(chart,800,600,session);
String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
%>
<img src="<%= url %>" width="800" height="600">
</body>
</html>
四:要通過Struts2整合JFreeChart ,可以學到Struts2整合其他插件的通用方法
怎么通過Struts2整合JFreeChart
通過用戶投票這個例子達到整合
select.jsp
<h1>請選擇喜歡的運動項目</h1>
<s:form action="viewResult">
<s:checkbox name="interest" label="足球"></s:checkbox>
<s:checkbox name="interest" label="籃球"></s:checkbox>
<s:checkbox name="interest" label="排球"></s:checkbox>
<s:checkbox name="interest" label="羽毛球"></s:checkbox>
</s:form>
上面的方式,顯示的時候所有的value都為true 這顯然不行的。
不可能提交的表單都為true的,修改如下
<h1>請選擇喜歡的運動項目</h1>
<s:form action="viewResult">
<s:checkbox name="interest" label="足球" fieldValue="football"></s:checkbox>
<s:checkbox name="interest" label="籃球" fieldValue="basktball"></s:checkbox>
<s:checkbox name="interest" label="排球" fieldValue="volleytball"></s:checkbox>
<s:checkbox name="interest" label="羽毛球" fieldValue="badminton"></s:checkbox>
<!--<s:checkboxlist list="#{'computer':'計算機','math':'數學'}"> name="interest" label="陽光" labelPosition="top"></s:checkboxlist>
-->
<s:submit value="提交"/>
</s:form>
<s:checkbox>與<s:checkboxlist>這2個標簽都是復選框,推薦使用s:checkbox
//要把struts2-jfreechart-plugin.jar復制到系統中
ViewResult這個Action的作用就是
首先把復選框中的數據加入到interest這個List中
然后把這個數據放到chart這個對象中
然后把chart對象交給JFreechart-plugin插件顯示輸出
這個action執行的時候,會執行execute方法
返回SUCCESS
這是的結果類型為chart,那么jfreechart-plugin這個插件會自動
調用action中的getChart方法,并顯示出來
package com.test.action;
public class ViewResultAction extends ActionSupport{
private JFreeChart chart;//chart變量不能隨便改的
//chart的setters getters方法
public JFreeChart getChart(){
chart=ChartFactory.createBarChart("興趣統計結果","項目","結果",getDataset(),PlotOrientation.VERTICAL,false,false,false);
chart.setTitle(new TextTitle("興趣統計結果",new Font("黑體",Font.BOLD,22)));
CategoryPlot plot=(CategoryPlot)chart.getPlot();
CategoryAxis axis=plot.getDomainAxis();//x坐標
axis.setLabelFont(new Font("宋體",Font.BOLD,22));
axis.setCategoryLabelPositionOffset(CategoryLabelPositions.UP_45);//字體的傾斜度
return chart;
}
//獲得表單數據
private List<String> interest;//自動把復選框的值設置到List中
//getters,setters方法
public String execute() throws Exception{
//從struts.apache.org中找到
//jfreechart-plugin
//jfreechart-plugin這個插件 能夠把chart對象(自動調用getChart()方法)生成到客戶端并能夠顯示
//不會我們去寫代碼生成圖片顯示了
return SUCCESS;
}
//把list客戶端的復選框的值保存到application中
private void increaseResult(List<String> list){
ActionContext context=ActionContext.getContext();
Map map=context.getApplication();//獲得application對象
//application對象中保存投票的結果 模擬
for(String str:list){
if(null==map.get(str)){//第一次投票
map.put(str,1);
}
else{//表示這個選項不是第一次投票
map.put(str,(Integer)map.get(str)+1);
}
}
}
private CategoryDataset getDataset(){//產生柱狀圖的數據
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
increaseResult(this.getInterest());//把數據更新到application中
ActionContext context=ActionContext.getContext();
Map map=context.getApplication();
//把application中的數據放到dataset中
dataset.setValue((Integer)map.get("football"),"","足球");
dataset.setValue((Integer)map.get("basketball"),"","藍球");
dataset.setValue((Integer)map.get("volleyball"),"","排球");
dataset.setValue((Integer)map.get("badminton"),"","羽毛球");
return dataset;
}
}
把jfreechart-plugin的jar包解壓縮
修改struts-plugin.xml中
把<package name="jfreechart-default">
修改為
<package name="jfreechart-default" extends="struts-default">
然后把jfreechart-plugin的jar包重新打包
jar cvf struts2-jfreechart-plugin-版本號.jar -C
生成后重新放到系統中
在struts.xml中進行配置
修改如下
<package name="struts2" extends="jfreechart-default">
<action name="viewResult" class="com.test.action.ViewResultAction">
<result name="success" type="chart">
<param name="height">600</param>
<param name="width">800</param>
</result>
</action>
這樣 運行項目 就會顯示結果了