0
点赞
收藏
分享

微信扫一扫

JFreeChart 案例1

奔跑的酆 2022-08-17 阅读 61


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


举报

相关推荐

0 条评论