JFreeChart 生成 柱状图(Struts2 + Maven3 + JFreeChart)

转自:http://www.blogjava.net/fancydeepin/archive/2012/08/07/java_jfreechart_BarChart3D.html

准备环境:

eclipse   3.6
maven   3.0.4
struts     2.1.8
JFreeChart  1.0.9


JFreeChart 是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。目前 JFreeChart 的最新版本是 1.0.14,

最近几天不知为何,sourceforge 网站一直无法访问,JFreeChart 现在在官网下载不了了,本人已将现用版本和最新版本上传至网盘,需要的朋友可以点击链接下载:

JFreeChart-1.0.9  :http://115.com/file/e7194ucb#jfreechart-1.0.9.zip

JFreeChart-1.0.14: http://115.com/file/an8lwzqu#jfreechart-1.0.14.zip

据说,JFreeChart 从 1.0.10 版本开始,图表的中文字体会变成乱码,我用 1.0.13 和 1.0.14 两个版本测试的时候确实是会出现中文乱码,1.0.9 这个版本不会出现这种情况,

解决这个乱码的过程有点繁琐,而且每种不同的图表的解决方式还不一样,但有一点是一样的,就是修改默认的字体,让它支持中文字体的显示,这样乱码问题就解决了。

由于这里用的 1.0.9 这个版本不会出现中文乱码问题,所以在这里姑且不谈。接下来会用到 maven 来管理 jar 包,不使用 maven 的朋友可以直接将 struts2 和 JFreeChart 的

jar 包导进项目里就 OK 了,maven 不会影响接下来要谈的 JFreeChart 柱状图的生成。

JFreeChart 所必须的 jar 包:jcommon-1.0.12.jar、jfreechart-1.0.9.jar (这里说的是 JFreeChart  1.0.9 版本,版本不同的请自行对应 jar 包版本)

OK,废话不多说,直接进入主题:

JFreeChart 组件中有个 JFreeChart类,它代表图表对象。生成任何类型的图表都要通过该对象,JFreeChart 组件提供了一个工厂类ChartFactory,用来创建各种类型的图表对象。

创建普通柱状图:ChartFactory.createBarChart( … )

创建 3D 柱状图:ChartFactory.createBarChart3D( … )

绘制 3D 柱状图的方法及方法入口参数:

ChartFactory.createBarChart3D(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, 
                                                                    boolean legend, boolean tooltips, boolean urls)


参数1:String title  —— 图表标题
参数2:String categoryAxisLabel     ——   统计种类轴标题,可以理解为X轴标题
参数3:String valueAxisLabel            ——   统计值轴标题,可以理解为y轴标题
参数4:CategoryDataset dataset       ——   绘图数据集
参数5:PlotOrientation orientation ——   设定柱形图的绘制方向,PlotOrientation.VERTICAL(垂直),PlotOrientation.HORIZONTAL(水平)
参数6:boolean legend     ——   设定是否显示图例
参数7:boolean tooltips  ——   设定是否采用标准生成器
参数8:boolean urls          ——   设定是否包生成链接


创建 maven 项目(不使用 maven 的朋友在 myeclipse 创建 Web 项目,或在 eclipse 下创建动态 Web 项目),项目名起: jfreechart-demo

web.xml 配置:

<? xml version="1.0" encoding="UTF-8" ?>
< web-app  version ="2.5"  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_2_5.xsd" >
  
   <!--  jfreechart  -->
   < servlet > 
       < servlet-name >DisplayChart </ servlet-name > 
       < servlet-class >org.jfree.chart.servlet.DisplayChart </ servlet-class > 
   </ servlet > 
   < servlet-mapping > 
       < servlet-name >DisplayChart </ servlet-name > 
       < url-pattern >/DisplayChart </ url-pattern > 
   </ servlet-mapping > 

   <!--  开启Struts2监听  -->
   < filter >
       < filter-name >struts2 </ filter-name >
       < filter-class >org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </ filter-class >
   </ filter >
   < filter-mapping >
       < filter-name >struts2 </ filter-name >
       < url-pattern >/* </ url-pattern >
   </ filter-mapping >
  
   < welcome-file-list >
     < welcome-file >/index.jsp </ welcome-file >
   </ welcome-file-list >

</ web-app >


struts.xml 配置(这里使用了 Struts2 的 convention 插件来实现零配置,没有使用  convention 插件的朋友请自行配置相应的 action):

<? 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 >

   < constant  name ="struts.devMode"  value ="true" />                                                   <!--  开发模式  -->
   < constant  name ="struts.i18n.encoding"  value ="UTF-8" />                                     <!--  Web运用编码  -->
   < constant  name ="struts.convention.result.path"  value ="/view/"   />                <!--  结果资源的路径  -->
   < constant  name ="struts.convention.action.name.separator"  value ="_"   />   <!--  URL资源分隔符  -->
   < constant  name ="struts.convention.classes.reload"  value ="true"   />               <!--  convention类重新加载  -->
   < constant  name ="struts.action.extension"  value ="action,do,html"   />            <!--  请求后缀  -->
  
</ struts >


pom.xml 配置(不使用 maven 的朋友不用配置这个文件,直接将需要的 jar 包导进项目即可):

< project  xmlns ="http://maven.apache.org/POM/4.0.0"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" >
   < modelVersion >4.0.0 </ modelVersion >
   < groupId >com.fancy </ groupId >
   < artifactId >jfreechart-demo </ artifactId >
   < packaging >war </ packaging >
   < version >1.0 </ version >
   < name >jfreechart-demo Maven Webapp </ name >
   < url >http://maven.apache.org </ url >
  
   < properties >
     < struts .version >2.1.8 </ struts.version >
   </ properties >
  
   < dependencies >
    
     <!--  Struts2 framework  -->
     < dependency >
       < groupId >org.apache.struts </ groupId >
       < artifactId >struts2-core </ artifactId >
       < version >${struts.version} </ version >
     </ dependency >
    
     <!--  Struts2 convention  -->
     < dependency >
       < groupId >org.apache.struts </ groupId >
       < artifactId >struts2-convention-plugin </ artifactId >
       < version >${struts.version} </ version >
     </ dependency >
    
     <!--  servlet  -->
     < dependency >     
       < groupId >javax.servlet </ groupId >     
       < artifactId >servlet-api </ artifactId >     
       < version >2.5 </ version > 
     </ dependency >
    
     <!--  JFreeChart  -->
     < dependency >
       < groupId >jfree </ groupId >
       < artifactId >jfreechart </ artifactId >
       < version >1.0.9 </ version >
     </ dependency >
    
   </ dependencies >
   < build >
     < finalName >jfreechar-demo </ finalName >
     <!--  Jetty Server  -->
     < plugins >
       < plugin >
         < groupId >org.mortbay.jetty </ groupId >
         < artifactId >maven-jetty-plugin </ artifactId >
         < version >6.1.10 </ version >
         < configuration >
           < scanIntervalSeconds >2 </ scanIntervalSeconds >
         </ configuration >
       </ plugin >
     </ plugins >
   </ build >
</ project >




package com.fancy.action;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
/**
 * -----------------------------------------
 * @描述  Action 超类
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-6 <p>
 * -----------------------------------------
 
*/

public  class BaseAction  extends ActionSupport  implements SessionAware {

    private static final long serialVersionUID = 1L;
    protected Map<String, Object> session;    //session

    public void setSession(Map<String, Object> session) {
        this.session = session;
    }


    public HttpSession getHttpSession() {
        HttpServletRequest request = ServletActionContext.getRequest();
        return request.getSession();
    }


}




核心类,主要看这里就行,你可以将 execute 方法里面的代码直接拷贝到 jsp 上面做测试)

package com.fancy.action;

import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
/**
 * -----------------------------------------
 * @描述  柱状图
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-6 <p>
 * -----------------------------------------
 
*/

public  class CylinderAction  extends BaseAction {

    private static final long serialVersionUID = 1L;
    private String fileName;
    
    public String execute() throws Exception{
        
        //模拟数据
        double[][] data  = {{1185,995,1286,1210},{916,1028,900,885},{982,763,935,665},{384,568,928,773}};
        String[] rowKeys = {"A产品","B产品","C产品","D产品"};
        String[] columKeys = {"E-1区","E-2区","E-3区","E-4区"};
        //创建Dataset对象
        CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columKeys, data);
        //创建3D柱状图
        JFreeChart chart = ChartFactory.createBarChart3D("2011年产品销售量", "", "销量/件", dataset, PlotOrientation.VERTICAL, truetruefalse);
        //设置背景颜色
        chart.setBackgroundPaint(Color.WHITE);
        fileName = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, getHttpSession());
        return "cylinder";
    }


    public String getFileName() {
        return fileName;
    }


}



在 webapp 目录下创建 view 子目录,在 view 目录里创建 cylinder.jsp 文件(不使用 maven 的朋友 jsp 文件位置请自行对应)

cylinder.jsp 文件:

<% @ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >

< html >
   < head >
     < title >柱状图 </ title >
   </ head >
  
   < body >
    
     < img  src ="${pageContext.request.contextPath}/DisplayChart?filename=${fileName}"  border =0  usemap ="#${fileName}" > 
    
   </ body >
</ html >


访问: http://localhost:8080/jfreechart-demo/cylinder.html (没有使用  convention 插件的朋友,访问地址请自行对应)结果如图:


在上图中,可以大概的看出产品的销售量在哪个范围之内,但是并没有具体的数值,下面通过在 CylinderAction 类上添加代码来使得这些数值能够被显示:


package com.fancy.action;

import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.ui.TextAnchor;
/**
 * -----------------------------------------
 * @描述  柱状图
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-6 <p>
 * -----------------------------------------
 
*/

public  class CylinderAction  extends BaseAction {

    private static final long serialVersionUID = 1L;
    private String fileName;
    
    public String execute() throws Exception{
        
        //模拟数据
        double[][] data  = {{1185,995,1286,1210},{916,1028,900,885},{982,763,935,665},{384,568,928,773}};
        String[] rowKeys = {"A产品","B产品","C产品","D产品"};
        String[] columKeys = {"E-1区","E-2区","E-3区","E-4区"};
        //创建Dataset对象
        CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columKeys, data);
        //创建3D柱状图
        JFreeChart chart = ChartFactory.createBarChart3D("2011年产品销售量", "", "销量/件", dataset, PlotOrientation.VERTICAL, truetruefalse);
        //设置背景颜色
        chart.setBackgroundPaint(Color.WHITE);
        
        //创建柱体绘制器对象
        BarRenderer3D renderer = new BarRenderer3D();
        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        //设置柱体数值可见
        renderer.setBaseItemLabelsVisible(true);
        //调整数值显示位置
        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT)); 
        renderer.setItemLabelAnchorOffset(10D); 
        chart.getCategoryPlot().setRenderer(renderer);
        
        fileName = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, getHttpSession());
        return "cylinder";
    }


    public String getFileName() {
        return fileName;
    }


}



再次访问: http://localhost:8080/jfreechart-demo/cylinder.html 结果如图:






   [ 随笔均原创,转载请注明出处:http://www.blogjava.net/fancydeepin ]
 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值