JFreeChart在Struts2中实现折线图统计

在Struts2中,用JFreeChart实现折线图统计

前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例。

下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式

需要加入的jar包有:  jcommon-1.0.17.jar 、 jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) 、 struts2-jfreechart-plugin-2.3.16.3.jar(这个是Struts2所带的,在下载的Struts2的lib目录下)、struts2所常用的9个核心jar包 。 jar包的版本可以有所不同

上述jar包放入到项目的WebRoot/WEB-INF/lib目录下

1、 以java应用程序的方式运行,在web项目中的src目录下新建包: com.jfreechart.test  , 在该包中新建类 LineChartTest.java

LineChartTest.java

package com.jfreechart.test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class LineChartTest {

	public static void main(String[] args) throws IOException{

        //步骤1:创建CategoryDataset对象(准备数据)
	    CategoryDataset dataset = createDataset();
        //步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置
        JFreeChart jfreeChart = createChart(dataset);
        //步骤3:将JFreeChart对象输出到文件
        saveAsFile("F:\\LineChart.jpg", jfreeChart, 800, 600);     

    } 

	/**
     * 创建一个dataset,该dataset包含图表要显示的数据
     * @return CategoryDataset
     */
	public static CategoryDataset createDataset() {
		// 图例名称
		String[] line = { "文学类", "科技类", "财经类", "娱乐类"};
		// 类别
		String[] category = { "2008年", "2009年", "2010年", "2012年", "2013年" };
		Random random = new Random(); // 实例化Random对象
		// 实例化DefaultCategoryDataset对象
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		// 使用循环向数据集合中添加数据
		for (int i = 0; i < line.length; i++) {
			for (int j = 0; j < category.length; j++) {
				dataset.addValue(100000 + random.nextInt(100000), line[i],
						category[j]);
			}
		}
		return dataset;
	}

	/**
     * 根据PieDataset创建JFreeChart对象
     * @return JFreeChart
     */
    public static JFreeChart createChart(CategoryDataset categoryDataset) {

      //JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart
      //ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化
	  //createLineChart()是制图工厂的一个方法,用来创建一个常规的折线图对象
      JFreeChart chart = ChartFactory.createLineChart(

    		"图书销量统计图",                 //图表标题
            "年份",                        //X轴标题
            "销售数量(本)",                        //Y轴标题
            categoryDataset,              //数据集
            PlotOrientation.VERTICAL,     //绘制方向
      		true,                         //是否显示图例
      		false,                        //是否采用标准生成器
      		false                         //是否支持超链接
      		);

      //通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)
      chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
      //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例
      LegendTitle legend = chart.getLegend(0);
      //设置图例的字体和字体大小,即位于下方的字的字体和大小
      legend.setItemFont(new Font("宋体", Font.BOLD, 14));
      // 设置画布背景色
      chart.setBackgroundPaint(new Color(192, 228, 106));
      //取得折线图的绘图(plot)对象
      CategoryPlot plot = chart.getCategoryPlot();
      //设置数据区的背景透明度,范围在0.0~1.0间
      plot.setBackgroundAlpha(0.5f);
      // 设置数据区的前景透明度,范围在0.0~1.0间
      plot.setForegroundAlpha(0.5f);
      // 设置横轴字体
      plot.getDomainAxis().setLabelFont(new Font("黑体", Font.BOLD, 14));
      // 设置坐标轴标尺值字体
	  plot.getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 12));
	  // 设置纵轴字体
	  plot.getRangeAxis().setLabelFont(new Font("黑体", Font.BOLD, 14));
	  // 设置绘图区背景色
	  plot.setBackgroundPaint(Color.WHITE);
	  // 设置水平方向背景线颜色
	  plot.setRangeGridlinePaint(Color.BLACK);
	  // 设置是否显示水平方向背景线,默认值为true
	  plot.setRangeGridlinesVisible(true);
	  // 设置垂直方向背景线颜色
	  plot.setDomainGridlinePaint(Color.BLACK);
	  // 设置是否显示垂直方向背景线,默认值为false
	  plot.setDomainGridlinesVisible(true);
	  // 没有数据时显示的消息
      plot.setNoDataMessage("没有相关统计数据");
      plot.setNoDataMessageFont(new Font("黑体", Font.CENTER_BASELINE, 16));
      plot.setNoDataMessagePaint(Color.RED);

		// 获取折线对象
		LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot
				.getRenderer();

		//设置折点处以某种形状凸出
		renderer.setShapesVisible(true);
		renderer.setDrawOutlines(true);
		renderer.setUseFillPaint(true);
		renderer.setFillPaint(java.awt.Color.WHITE);

		//设置显示折点处的数据值
		//renderer.setBaseItemLabelGenerator (new StandardCategoryItemLabelGenerator ());
		//renderer.setItemLabelFont (new Font ("黑体", Font.PLAIN, 12));
		//renderer.setItemLabelsVisible (true);

        BasicStroke realLine = new BasicStroke(2.0f); // 设置实线
		float dashes[] = { 8.0f }; // 定义虚线数组
		BasicStroke brokenLine = new BasicStroke(2.0f, // 线条粗细
				BasicStroke.CAP_SQUARE, // 端点风格
				BasicStroke.JOIN_MITER, // 折点风格
				8.f, // 折点处理办法
				dashes, // 虚线数组
				0.0f); // 虚线偏移量
		// 利用虚线绘制
		renderer.setSeriesStroke(0, brokenLine);
		// 利用虚线绘制
		renderer.setSeriesStroke(1, brokenLine);
		// 利用实线绘制
		renderer.setSeriesStroke(2, realLine);
		// 利用实线绘制
		renderer.setSeriesStroke(3, realLine);

		//设置折线的颜色
		renderer.setSeriesPaint(0, Color.BLACK);
		renderer.setSeriesPaint(1, Color.RED);
		renderer.setSeriesPaint(2, Color.BLUE);
		renderer.setSeriesPaint(3, Color.MAGENTA);

      return chart;
    }

	/**
	 * 保存图表为文件
	 */
    public static void saveAsFile(String filePath, JFreeChart jfreeChart,
            int weight, int height) throws IOException { 

    	//输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)
        ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);
    }

}

以java应用程序的方式,运行上面的 LineChartTest.java ,便可以在F盘的根目录下产生了一个名叫LineChart.jpg文件,如下图所示:

2、 以web项目程序的方式运行

(1)在web项目中的src目录下新建包: com.jfreechart.action , 在该包中新建类LineChartAction.java

LineChartAction.java

package com.jfreechart.action;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Random;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import com.jfreechart.commons.FileUtil;
import com.opensymphony.xwork2.ActionContext;

public class LineChartAction {
	private JFreeChart chart;

	// 必须提供 getChart() 方法,且由该方法返回 JFreeChart 对象
	public JFreeChart getChart() throws Exception {
		  //JFreeChart类是一个制图对象类,先用它来创建一个制图对象chart
	      //ChartFactory类是制图工厂类,用它来为制图对象chart完成实例化
		  //createLineChart()是制图工厂的一个方法,用来创建一个常规的折线图对象
		  chart = ChartFactory.createLineChart(

	    		"图书销量统计图",                 //图表标题
	            "年份",                        //X轴标题
	            "销售数量(本)",                        //Y轴标题
	            createDataset(),              //数据集
	            PlotOrientation.VERTICAL,     //绘制方向
	      		true,                         //是否显示图例
	      		false,                        //是否采用标准生成器
	      		false                         //是否支持超链接
	      		);

	      //通过JFreeChart对象的 setTitle方法,修改统计图表的标题部分(包括修改图表标题内容、字体大小等)
	      chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
	      //调用 JFreeChart对象的 getLegend(int index)方法,取得该图表的指定索引的图例对象,通过 LegendTitle对象来修改统计图表的图例
	      LegendTitle legend = chart.getLegend(0);
	      //设置图例的字体和字体大小,即位于下方的字的字体和大小
	      legend.setItemFont(new Font("宋体", Font.BOLD, 14));
	      // 设置画布背景色
	      chart.setBackgroundPaint(new Color(192, 228, 106));
	      //取得折线图的绘图(plot)对象
	      CategoryPlot plot = chart.getCategoryPlot();
	      //设置数据区的背景透明度,范围在0.0~1.0间
	      plot.setBackgroundAlpha(0.5f);
	      // 设置数据区的前景透明度,范围在0.0~1.0间
	      plot.setForegroundAlpha(0.5f);
	      // 设置横轴字体
	      plot.getDomainAxis().setLabelFont(new Font("黑体", Font.BOLD, 14));
	      // 设置坐标轴标尺值字体
		  plot.getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 12));
		  // 设置纵轴字体
		  plot.getRangeAxis().setLabelFont(new Font("黑体", Font.BOLD, 14));
		  // 设置绘图区背景色
		  plot.setBackgroundPaint(Color.WHITE);
		  // 设置水平方向背景线颜色
		  plot.setRangeGridlinePaint(Color.BLACK);
		  // 设置是否显示水平方向背景线,默认值为true
		  plot.setRangeGridlinesVisible(true);
		  // 设置垂直方向背景线颜色
		  plot.setDomainGridlinePaint(Color.BLACK);
		  // 设置是否显示垂直方向背景线,默认值为false
		  plot.setDomainGridlinesVisible(true);
		  // 没有数据时显示的消息
	      plot.setNoDataMessage("没有相关统计数据");
	      plot.setNoDataMessageFont(new Font("黑体", Font.CENTER_BASELINE, 16));
	      plot.setNoDataMessagePaint(Color.RED);

			// 获取折线对象
			LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot
					.getRenderer();

			//设置折点处以某种形状凸出
			renderer.setShapesVisible(true);
			renderer.setDrawOutlines(true);
			renderer.setUseFillPaint(true);
			renderer.setFillPaint(java.awt.Color.WHITE);

			//设置显示折点处的数据值
			//renderer.setBaseItemLabelGenerator (new StandardCategoryItemLabelGenerator ());
			//renderer.setItemLabelFont (new Font ("黑体", Font.PLAIN, 12));
			//renderer.setItemLabelsVisible (true);

	        BasicStroke realLine = new BasicStroke(2.0f); // 设置实线
			float dashes[] = { 8.0f }; // 定义虚线数组
			BasicStroke brokenLine = new BasicStroke(2.0f, // 线条粗细
					BasicStroke.CAP_SQUARE, // 端点风格
					BasicStroke.JOIN_MITER, // 折点风格
					8.f, // 折点处理办法
					dashes, // 虚线数组
					0.0f); // 虚线偏移量
			// 利用虚线绘制
			renderer.setSeriesStroke(0, brokenLine);
			// 利用虚线绘制
			renderer.setSeriesStroke(1, brokenLine);
			// 利用实线绘制
			renderer.setSeriesStroke(2, realLine);
			// 利用实线绘制
			renderer.setSeriesStroke(3, realLine);

			//设置折线的颜色
			renderer.setSeriesPaint(0, Color.BLACK);
			renderer.setSeriesPaint(1, Color.RED);
			renderer.setSeriesPaint(2, Color.BLUE);
			renderer.setSeriesPaint(3, Color.MAGENTA);

        //设置生成的图表的文件名
        String fileName = "LineChartBook.jpg";
        //设置图表输出的指定路径
        String filePath = FileUtil.getWebRootPath()+"images\\chart\\"+fileName;
        //输出图表到文件
        saveAsFile(filePath, chart, 800, 600);

        //取得request对象
        Map request = (Map)ActionContext.getContext().get("request");
		//把生成的图表文件的路径filePath放进request对象中
        request.put("filePath", filePath);

		return chart;
	}

	/**
	 * 保存图表为文件
	 */
    public static void saveAsFile(String filePath, JFreeChart jfreeChart,
            int weight, int height) throws IOException { 

    	//输出图表到文件,saveCharAsJPEG()方法的参数(File file,JFreeChart chart,int width,int height)
        ChartUtilities.saveChartAsJPEG(new File(filePath), jfreeChart, weight, height);
    }

    /**
     * 创建一个dataset,该dataset包含图表要显示的数据
     * @return CategoryDataset
     */
	public static CategoryDataset createDataset() {
		// 图例名称
		String[] line = { "文学类", "科技类", "财经类", "娱乐类" };
		// 类别
		String[] category = { "2008年", "2009年", "2010年", "2012年", "2013年" };
		Random random = new Random(); // 实例化Random对象
		// 实例化DefaultCategoryDataset对象
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		// 使用循环向数据集合中添加数据
		for (int i = 0; i < line.length; i++) {
			for (int j = 0; j < category.length; j++) {
				dataset.addValue(100000 + random.nextInt(100000), line[i],
						category[j]);
			}
		}
		return dataset;
	}

	//在struts.xml中的对应<action>里,应该写的是  method="pieChart" 和  <result type="chart">
	public String lineChart() {
		return "success";
	}
}

(2)在web项目中的src目录下新建struts.xml文件

struts.xml

[java] view
plain
copyprint?

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
  3. <struts>
  4. <!-- 配置 Struts 2 应用中的常量 -->
  5. <constant name="struts.i18n.encoding" value="UTF-8"/>
  6. <!-- 配置本应用中的包,继承 jfreechart-default 包 -->
  7. <package name="chart" extends="jfreechart-default">
  8. <!-- 定义一个名为 lineChart 的 Action -->
  9. <action name="lineChart" class="com.jfreechart.action.LineChartAction" method="lineChart">
  10. <result type="chart">
  11. /LineChart.jsp
  12. <!-- 定义 JFreeChart 报表的大小 -->
  13. <param name="width">800</param>
  14. <param name="height">500</param>
  15. </result>
  16. </action>                                                                             </package>
  17. </struts>

(3)修改在web项目中的WebRoot/WEB-INF/目录下的web.xml

web.xml

[java] view
plain
copyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <!-- 设置struts 2过滤器 -->
  8. <filter>
  9. <filter-name>struts 2</filter-name>
  10. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>struts 2</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>
  16. <!-- 设置欢迎页面 -->
  17. <welcome-file-list>
  18. <welcome-file>index.jsp</welcome-file>
  19. </welcome-file-list>
  20. <!-- session超时定义,单位为分钟 -->
  21. <session-config>
  22. <session-timeout>30</session-timeout>
  23. </session-config>
  24. </web-app>

(4)在web项目中的src目录下新建包: com.jfreechart.commons , 在该包中新建类 FileUtil.java

FileUtil.java

[java] view
plain
copyprint?

  1. package com.jfreechart.commons;
  2. import javax.servlet.ServletContext;
  3. import org.apache.struts2.ServletActionContext;
  4. import com.opensymphony.xwork2.ActionContext;
  5. public class FileUtil {
  6. /**
  7. * 获得web项目根目录
  8. */
  9. public static String getWebRootPath() throws Exception {
  10. ActionContext actionContext = ActionContext.getContext();
  11. ServletContext servletContext = (ServletContext)actionContext.get(ServletActionContext.SERVLET_CONTEXT);
  12. String rootPath = servletContext.getRealPath("/");
  13. return rootPath;
  14. }
  15. }

(5)修改在web项目中的WebRoot/目录下新建index.jsp、LineChart.jsp

index.jsp

[java] view
plain
copyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>首页</title>
  11. </head>
  12. <body>
  13. <a href="lineChart.action">查看折线图</a><br />
  14. </body>
  15. </html>

LineChart.jsp

[java] view
plain
copyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>折线图</title>
  12. </head>
  13. <body>
  14. <img src="<s:property value="#request.filePath" />" />
  15. </body>
  16. </html>

完成以上步骤后,把项目部署到服务器,在浏览器中访问该项目的index.jsp文件,点击“查看折线图”的链接,即可跳转到LineChart.jsp页面,折线图图表就显示在LineChart.jsp页面上了,图表的效果如上图一致。另外,上述所用的方法是 把图表先生成一个jpg文件,存放在服务器上的该web项目的相关目录下,然后在前台的jsp页面中引用该文件在项目中的的文件路径,即可把图表显示到前台页面中

时间: 2024-08-09 04:09:17

JFreeChart在Struts2中实现折线图统计的相关文章

JFreeChart在Struts2中实现3D柱状图统计

上篇介绍了JFreeChart柱状图在Struts2中的实现,这篇来看一下3D柱状图的实现. 在Struts2中,用JFreeChart实现3D柱状图统计 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2

JFreeChart在Struts2中实现3D折线图统计

在Struts2中,用JFreeChart实现3D折线图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar

安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图

前面几篇博客中都是调用ChartFactory.get***Intent()方法,本节讲的内容调用ChartFactory.get***View()方法,这个方法调用的结果可以嵌入到任何一个Activity中,作为Activity的一部分. XYChartBuilder.java(源码分析见注释) [java] view plaincopy package org.achartengine.chartdemo.demo.chart; import java.io.File; import jav

JFreeChart在Struts2中实现3D饼状图统计

在Struts2中,用JFreeChart实现3D饼状图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar

Flex中的折线图

1.问题背景 在Flex中,制作一个折线图,并且给折线图的横轴和纵轴进行样式设置,具体实现步骤如下: 2.实现实例 (1)设置横轴样式和数据绑定 <mx:horizontalAxis> <mx:CategoryAxis categoryField="quarter" displayName="季度"/> </mx:horizontalAxis> <mx:horizontalAxisRenderers> <mx:A

echarts在同一个dom上多次画图有时候不显示,有时候饼图中出现折线图的坐标轴

在init方法前,添加如下代码: var myChart = null; if (myChart && myChart.dispose) { myChart.dispose(); } myChart = echarts.init(document.getElementById("main"));

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有的也使用了动画,但是线条颜色渐变的折线图的demo少之又少,甚至可以说没有.该Blog阐述了动画绘制线条颜色渐变的折线图的实现方案,以及折线图线条颜色渐变的实现原理,并附以完整的示例. 成果 本人已将折线图封装到了一个UIView子类中,并提供了相应的接口.该自定义折线图视图,基本上可以适用于大部分

安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图

折线图: [java] view plaincopy package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.List; import org.achartengine.ChartFactory; import org.achartengine.chart.PointStyle; import org.achartengine.renderer.XYMultipleSe

gnuplot画折线图

之前尝试用jfreechart画自定义横坐标的折线图或时序图,发现很复杂,后来改用gnuplot了. gnuplot在网上一搜就能找到下载地址. 安装完成后,主要是命令行形式的交互界面,至少比jfreechart进步一些... set xrange [0:240]  #设置x轴范围 set yrange [1:1.5]  #设置y轴范围 set xtics ("0" 0, "60" 60, "120" 120, "180" 1