一.下载与环境配置
1. 下载JFreeChart
我们需要的包为jfreechart-1.0.6.jar和jcommon-1.0.10.jar
jFreeChart与Struts2的组合:
一,加入Struts2支持
二,加入struts2-jfreechart-plugin-2.1.8.1.jar
注意:有的版本的此包有点小问题,此包内有一个struts-plugin.xml内容如下:
Xml代码
1
2
3
4
5 class="org.apache.struts2.dispatcher.ChartResult"> 6150 7200 8
9
10
11
12
若该package没有继承struts-default则需要手动加上extends="struts-default"再重新用jdk打包
三,在action中生成我们的图片报表
package com.ynbs.manage.jfreechart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
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 com.ynbs.javaeeframework.base.vo.BaseVo;
import com.ynbs.manage.base.action.ManageAction;
public class ViewResultAction extends ManageAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private BaseVo baseVo ;
private JfreechartUtils jfutil=new JfreechartUtils();
public ViewResultAction() {
this.baseVo = new BaseVo() ;
}
public BaseVo getModel() {
return this.baseVo ;
}
public String navigation() throws Exception {
return SUCCESS ;
}
/**
* 这里的JFreeChart的变量名称必须是chart(这是jfreeChart插件不足的地方)*/
private JFreeChart chart = null;
@SuppressWarnings("unchecked")
//柱状图
public String barchart() throws Exception {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(100, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(400, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
chart = ChartFactory.createBarChart3D(
"水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
true // 是否生成URL链接
);
new JfreechartUtils().checkbar(chart);
return "barchart";
}
//饼图
public String piechart() throws Exception {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果",100);
dataset.setValue("梨子",200);
dataset.setValue("葡萄",300);
dataset.setValue("香蕉",400);
dataset.setValue("荔枝",500);
chart =ChartFactory.createPieChart3D("水果产量图", // 图表标题dataset,
true, // 是否显示图例
false,
false
);
jfutil.checkpie(chart);
return "piechart";
}
//折线图
public String linechart() throws Exception {
TimeSeries timeSer1 = new TimeSeries("2006年度", Month.class);
TimeSeriesCollection dataset=new TimeSeriesCollection();
timeSer1.add(new Month(1,2007),11200);
timeSer1.add(new Month(2,2007),9000);
timeSer1.add(new Month(3,2007),6200);
timeSer1.add(new Month(4,2007),8200);
timeSer1.add(new Month(5,2007),8200);
timeSer1.add(new Month(6,2007),12200);
timeSer1.add(new Month(7,2007),13200);
timeSer1.add(new Month(8,2007),8300);
timeSer1.add(new Month(9,2007),12400);
timeSer1.add(new Month(10,2007),12500);
timeSer1.add(new Month(11,2007),13600);
timeSer1.add(new Month(12,2007),12500);
TimeSeries timeSer2 = new TimeSeries("2007年度", Month.class);
timeSer2.add(new Month(1,2007),1100);
timeSer2.add(new Month(2,2007),900);
timeSer2.add(new Month(3,2007),620);
timeSer2.add(new Month(4,2007),820);
timeSer2.add(new Month(5,2007),820);
timeSer2.add(new Month(6,2007),1220);
timeSer2.add(new Month(7,2007),1320);
timeSer2.add(new Month(8,2007),830);
timeSer2.add(new Month(9,2007),1240);
timeSer2.add(new Month(10,2007),1250);
timeSer2.add(new Month(11,2007),1360);
timeSer2.add(new Month(12,2007),1250);
dataset.addSeries(timeSer1);
dataset.addSeries(timeSer2);
chart=ChartFactory.createTimeSeriesChart("访问量统计时间线","月份","访问量",dataset,true,true,true);
jfutil.checkline(chart);
return "linechart";
}
public JFreeChart getChart() {
return chart;
}
public void setChart(JFreeChart chart) {
this.chart = chart;
}
}
//附加JfreechartUtils 解决乱码类
package com.ynbs.manage.jfreechart;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import https://www.doczj.com/doc/555816832.html,bels.ItemLabelAnchor;
import https://www.doczj.com/doc/555816832.html,bels.ItemLabelPosition;
import https://www.doczj.com/doc/555816832.html,bels.StandardCategoryItemLabelGenerator; import https://www.doczj.com/doc/555816832.html,bels.StandardPieSectionLabelGenerator; import https://www.doczj.com/doc/555816832.html,bels.StandardPieToolTipGenerator;
import https://www.doczj.com/doc/555816832.html,bels.StandardXYItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.ui.TextAnchor;
public final class JfreechartUtils {
public JfreechartUtils() {
}
/**
* 解决柱状图乱码
*
*
*/
public static void checkbar(JFreeChart chart)
{
CategoryPlot plot = (CategoryPlot) chart.getPlot();
// 设置水平方向的样式
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 20));
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// 设置垂直方向的样式
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
numberAxis.setLabelFont(new Font("仿宋", https://www.doczj.com/doc/555816832.html,YOUT_NO_LIMIT_CONTEXT, 18));
// 获得报表下面部分
// chart.getLegend();
CategoryAxis domainAxis = plot.getDomainAxis();
// 设置水平底部列表
domainAxis.setLabelFont(new Font("黑体", Font.BOLD, 14));
// 设置水平底部标题
domainAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 12));
// 设置锤子标题
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(new Font("黑体", Font.BOLD, 18));
// 设置说明的字体
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 18));
chart.getTitle().setFont(new Font("黑体", Font.BOLD, 20));
BarRenderer3D renderer= new BarRenderer3D();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
//默认的数字显示在柱子中,通过如下两句可调整数字的显示//注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
renderer.setBasePositiveItemLabelPosition(new
ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT));
renderer.setItemLabelAnchorOffset(10D);
//设置每个地区所包含的平行柱的之间距离
//renderer.setItemMargin(0.3);
plot.setRenderer(renderer);
}
/**
* 解决饼图乱码
*
*
*/
public static void checkpie(JFreeChart chart)
{
chart.getTitle().setFont(new Font("黑体", Font.BOLD, 20));
PiePlot piePlot = (PiePlot) chart.getPlot();
String unitSytle = "{0}={1}({2})";
piePlot.setNoDataMessage("无对应的数据,请重新查询。");
piePlot.setNoDataMessagePaint(Color.red);
//指定section 轮廓线的厚度(OutlinePaint不能为null)
piePlot.setOutlineStroke(new BasicStroke(0));
//设置第一个section 的开始位置,默认是12点钟方向
piePlot.setStartAngle(90);
piePlot.setToolTipGenerator(new StandardPieToolTipGenerator(unitSytle,
NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
//指定图片的透明度
piePlot.setForegroundAlpha(0.5f);
//引出标签显示样式
piePlot.setLabelGenerator(new
StandardPieSectionLabelGenerator(unitSytle,
NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
//图例显示样式
piePlot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(unitSytle,
NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
piePlot.setLabelFont(new Font("黑体", Font.BOLD, 10));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 10));
}
/**
* 解决折线图乱码
*
*
*/
public static void checkline(JFreeChart chart)
{
chart.setAntiAlias(true);
XYPlot plot = (XYPlot) chart.getPlot();
XYLineAndShapeRenderer xylineandshaperenderer =(XYLineAndShapeRenderer)plot.getRenderer();
xylineandshaperenderer.setBaseShapesVisible(true);
XYItemRenderer xyitem=plot.getRenderer();
xyitem.setBaseItemLabelsVisible(true);
xyitem.setBasePositiveItemLabelPosition(new
ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT));
xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
xyitem.setBaseItemLabelFont(new Font("Dialog",1,14));
plot.setRenderer(xyitem);
ValueAxis valueAxis = plot.getDomainAxis();
// 设置x轴上面的字体
valueAxis.setTickLabelFont(new Font("隶书", Font.ITALIC, 12));
// 设置X轴的标题文字
valueAxis.setLabelFont(new Font("隶书", Font.ITALIC, 12));
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
// 设置y轴上的字体
numberAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 13));
// 设置y轴上的标题字体
numberAxis.setLabelFont(new Font("宋体", Font.PLAIN, 13));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 18));
chart.getTitle().setFont(new Font("黑体", Font.BOLD, 20));
}
}
四,struts.xml中的配置:
600
800
600
800
600
800
显示结果如下:
柱状图
饼图
折现图