关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »JFreeChart在Struts2中折线图统计的实现

    JFreeChart在Struts2中折线图统计的实现

    2014-11-08 00:00:00 出处:简单之美
    分享

    前段时间学习了一下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

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

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

    web.xml

    < xml version="1.0" encoding="UTF-8" >  
    <web-app version="3.0"   
        xmlns="http://java.sun.com/xml/ns/javaee"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
    
      <!-- 设置struts 2过滤器 -->  
      <filter>  
          <filter-name>struts 2</filter-name>  
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
      </filter>  
      <filter-mapping>  
          <filter-name>struts 2</filter-name>  
          <url-pattern>/*</url-pattern>  
      </filter-mapping>  
    
      <!-- 设置欢迎页面 -->  
      <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
      </welcome-file-list>  
    
      <!-- session超时定义,单位为分钟 -->  
      <session-config>  
        <session-timeout>30</session-timeout>  
      </session-config>  
    
    </web-app>

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

    FileUtil.java

    package com.jfreechart.commons;  
    
    import javax.servlet.ServletContext;  
    
    import org.apache.struts2.ServletActionContext;  
    
    import com.opensymphony.xwork2.ActionContext;  
    
    public class FileUtil {  
    
        /** 
         * 获得web项目根目录 
         */  
        public static String getWebRootPath() throws Exception {  
            ActionContext actionContext = ActionContext.getContext();  
            ServletContext servletContext = (ServletContext)actionContext.get(ServletActionContext.SERVLET_CONTEXT);  
            String rootPath = servletContext.getRealPath("/");  
            return rootPath;  
        }  
    }

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

    index.jsp

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

    LineChart.jsp

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

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    windows 7应用程序无法启动出现窗口提示找不到应用程序

    SQL中数据类型转换函数的使用

    MySQL使用变量的注意事项

    SQL Server 锁自定义的示例演示

    如何在Linux命令行中创建以及展示演示稿

    windows 7任务栏显示标题的方法(windows 7任务栏缩略图不显示出

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。