JFreeChart 案例1

使用JFreeChart与Struts2实现饼图和柱状图展示
本文介绍了如何利用JFreeChart和Struts2框架来创建饼图和柱状图,并通过实际的例子展示了具体操作步骤,包括数据准备、图表生成及展示方式。

JFreeChart 是一个非常流行的一个免费开源的图表软件
已经有11年以上的历史

首先要下载jar包
www.jfree.org

在http://www.jfree.org/jfreechart 下点击Project Page at SourceForge 去下载
要下载JFreeChart 与JCommon

做JFreeChart的时候,一般是以下三步
1:要有数据 比如DefaultPieDataset
2:根据数据生成 JFreeChart 对象
3:显示JFreeChart对象(显示在swing中或生成一个图片在jsp中显示)

下面看一个例子:

主要是用JFreeChart做的饼图和柱状图,用到了struts2

1.Action类(一个处理部门的饼图,一个地市柱形图):

public class DeptPieChartAction extends ActionSupport {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 1L;

	private JFreeChart chart;  
	private Date startTime;	
	private String startTimeStr;
     
    @Override  
    public String execute() throws Exception {  
    	if(startTime != null){
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
    		
    		startTimeStr = sdf.format(startTime);
    		
    		startTimeStr = startTimeStr + "-01 00:00:00";
    	}
    	TJByChart tc = new TJByChart();
        chart = tc.createDeptPieChart(startTimeStr);
        return SUCCESS;  
    }  
      
    public JFreeChart getChart() {  
        return chart;  
    }

	public void setChart(JFreeChart chart) {
		this.chart = chart;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public String getStartTimeStr() {
		return startTimeStr;
	}

	public void setStartTimeStr(String startTimeStr) {
		this.startTimeStr = startTimeStr;
	}  
}

public class RNumBarChartAction extends ActionSupport {


	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 1L;


	private JFreeChart chart;  
     
    @Override  
    public String execute() throws Exception {  
    	TJByChart tc = new TJByChart();
        chart = tc.createReceiveCaseBarChart();
        return SUCCESS;  
    }  
      
    public JFreeChart getChart() {  
        return chart;  
    }


	public void setChart(JFreeChart chart) {
		this.chart = chart;
	}  
}

2.service 类:

import java.awt.Font;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.struts2.ServletActionContext;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.jdbc.JDBCPieDataset;

import com.metarnet.cssf.common.PropertiesParser;
import com.metarnet.cssf.common.UserManager;
import com.metarnet.cssf.common.db.ConnectionPool;
import com.metarnet.cssf.model.User;

/*
 * 图形统计表-统计概览 
 * */
public class TJByChart {
	private User user = UserManager.getInstance().getUserBySessionId(ServletActionContext.getRequest().getRequestedSessionId());
	
	
	
	//接单/驳单统计
	public JFreeChart createReceiveCaseBarChart(){
		CategoryDataset dataset = initReceiveCaseBarDate();  
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MONTH, -1);
		String name = cal.get(Calendar.YEAR) + "年" + (cal.get(Calendar.MONTH) + 1) + "月";
		
        JFreeChart chart = ChartFactory.createBarChart3D(  
                name + "处理/驳回统计", // 图表标题  
                "地市", 
                "数量",   
                dataset, // 数据集  
                PlotOrientation.VERTICAL, // 图表方向:水平、垂直  
                true,   // 是否显示图例(对于简单的柱状图必须是false)  
                true,   // 是否生成工具  
                true    // 是否生成URL链接  
                );  
        
        chart.getTitle().setFont(new Font("隶书",Font.BOLD,18));
		chart.getLegend().setItemFont(new Font("宋体",Font.BOLD, 14));
		chart.setBorderVisible(true);
		
		CategoryPlot plot = chart.getCategoryPlot();
		plot.setForegroundAlpha(0.8F);
		plot.setBackgroundAlpha(0.5F);
		
		CategoryAxis categoryAxis = plot.getDomainAxis();
		categoryAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		categoryAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
		categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
		
		ValueAxis valueAxis = plot.getRangeAxis();
		valueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		
		BarRenderer3D renderer = new BarRenderer3D();
		renderer.setItemMargin(0.32);
		
		plot.setRenderer(renderer);
	
        return chart;  
	}
	
	private CategoryDataset initReceiveCaseBarDate(){
		DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
		
		Connection conn = null;
		Statement stat = null;
		ResultSet rs = null;
		
		try {
			String sql = "select city_id,city_name,isreject,count(*) as cnum from cssf_ts_statistics where 1 = 1 ";
			if(user.getCityId() > 0){	//省份
				sql = sql + " and city_id = " + user.getCityId();
			}
			//时间
			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.MONTH, -1);
			cal.set(Calendar.DAY_OF_MONTH, 1);
			cal.set(Calendar.HOUR_OF_DAY, 0);
			cal.set(Calendar.MINUTE, 0);
			cal.set(Calendar.SECOND, 0);
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String start = sdf.format(cal.getTime());

			cal.add(Calendar.MONTH, 1);
			String end = sdf.format(cal.getTime());
			sql = sql + " and sponsor_time >= to_date('" + start + "','yyyy-mm-dd hh24:mi:ss') and sponsor_time < to_date('"
					+ end + "','yyyy-mm-dd hh24:mi:ss') group by city_id,city_name,isreject order by city_id";
			conn = ConnectionPool.getInstance().getConnection("cssf");
			stat = conn.createStatement();
			rs = stat.executeQuery(sql);
			Map<String, int[]> retMap = new LinkedHashMap<String, int[]>();
			while(rs.next()){
				String cityname = rs.getString("city_name");
				int cityId = rs.getInt("city_id");
				int isreject = rs.getInt("isreject");
				int num = rs.getInt("cnum");
				
				if(retMap.containsKey(cityname)){
					int[] arr = retMap.get(cityname);
					if(isreject == 1){
						arr[1] = num;
					}else{
						arr[0] = num;
					}
					arr[2] = cityId;
				}else{
					int[] arr = new int[3];
					if(isreject == 1){
						arr[1] = num;
					}else{
						arr[0] = num;
					}
					arr[2] = cityId;
					retMap.put(cityname, arr);
				}
			}
			
			
			Iterator<String> iter = retMap.keySet().iterator();
			while(iter.hasNext()){
				String cityName = iter.next();
				int[] arr = retMap.get(cityName);
				
				dataSet.addValue(arr[0], "处理", cityName);
				dataSet.addValue(arr[1], "驳回", cityName);
			}
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try { rs.close(); } catch (Exception e) { }
			try { stat.close(); } catch (Exception e) { }
			try { conn.close(); } catch (Exception e) { }
			
		}
		
		return dataSet;
	}

	//创建处理部门统计饼图
	public JFreeChart createDeptPieChart(String startTime){
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MONTH, -1);
		String name = cal.get(Calendar.YEAR) + "年" + (cal.get(Calendar.MONTH) + 1) + "月";
		JFreeChart chart = ChartFactory.createPieChart3D(name + "投诉处理部门统计图", initDeptPieData(), true, true, false);
		
		chart.getTitle().setFont(new Font("隶书",Font.BOLD,18));
		chart.getLegend().setItemFont(new Font("宋体",Font.BOLD, 14));
		
		chart.setBorderVisible(true);
		
		PiePlot plot = (PiePlot) chart.getPlot();
		plot.setForegroundAlpha(0.5f);
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		plot.setCircular(true);
		
		//设置分类标签的格式
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{2}",
				new DecimalFormat("0.00%"),
				new DecimalFormat("0.00%")
		));

		return chart;
	}
	
	//加载处理部门统计数据
	private PieDataset initDeptPieData(){
		JDBCPieDataset dataset = null;
		
		PropertiesParser prop = new PropertiesParser();
		try {
			dataset = new JDBCPieDataset(
					prop.getProperty("cssf.url"),
					prop.getProperty("cssf.driver"),
					prop.getProperty("cssf.user"),
					prop.getProperty("cssf.password")
			);
			//select duty_dept,count(*) from cssf_ts_statistics group by duty_dept
			String sql = "select duty_dept,count(*) from cssf_ts_statistics where 1 = 1 and duty_dept is not null";
			if(user.getCityId() > 0){	//省份
				sql = sql + " and city_id = " + user.getCityId();
			}
			
			//时间
			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.MONTH, -1);
			cal.set(Calendar.DAY_OF_MONTH, 1);
			cal.set(Calendar.HOUR_OF_DAY, 0);
			cal.set(Calendar.MINUTE, 0);
			cal.set(Calendar.SECOND, 0);
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String start = sdf.format(cal.getTime());

			cal.add(Calendar.MONTH, 1);
			String end = sdf.format(cal.getTime());
			sql = sql + " and sponsor_time >= to_date('" + start + "','yyyy-mm-dd hh24:mi:ss') and sponsor_time < to_date('"
					+ end + "','yyyy-mm-dd hh24:mi:ss') group by duty_dept";
			System.out.println("dept: " + sql);
			dataset.executeQuery(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(dataset != null) dataset.close();
		}
		
		return dataset;
	}
}
3.struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="jFreeChartPkg" extends="struts-default" namespace="/jfcpkg">
		<result-types>
			<result-type name="chart"
				class="org.apache.struts2.dispatcher.ChartResult">
			</result-type>
		</result-types>
		<action name="deptPieChart" class="com.metarnet.cssf.action.report.common.complaint.DeptPieChartAction">
			<result type="chart">
				<param name="width">330</param>
				<param name="height">200</param>
			</result>
		</action>
		
		<action name="rnumBarChart" class="com.metarnet.cssf.action.report.common.complaint.RNumBarChartAction">
			<result type="chart">
				<param name="width">1020</param>
				<param name="height">350</param>
			</result>
		</action>
		</package>
</struts>

4.jsp

<body>
  	<div align="center">
	    <img src="jfcpkg/deptPieChart.action">   
	   <hr>
	    <img src="jfcpkg/rnumBarChart.action">
    </div>
  </body>

5.需要的JAR包

jcommon-1.0.17.jar,jfreechart-1.0.14.jar;这两个是必须的,当用到struts2时,还需用到struts2-jfreechart-plugin-2.3.14.jar

下载地址:http://download.youkuaiyun.com/detail/lifuxiangcaohui/5729185



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java海洋

你的鼓励,是我写下去的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值