`
zhaobing315
  • 浏览: 231683 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JFreechart生成带热点的饼图

阅读更多

      前段时间公司要做报表开发,顺便研究了下JFreechart的简单使用,个人觉得JFreechart生成的图片效果很差,如:图像、字体模糊,缺乏动态效果,比flash相差很远。不过作为学习,跟大家交流下JFreechart的开发过程。

 

      遇到问题:

      windows下图片中文显示乱码--这个主要是由于没有给中文设置字体造成的

      某些linux下图片中文显示乱码--这个主要是由于该linux系统缺乏中文字体,向linux的字体目录下导入中文字体即可(具体方法网上很多)

      这两种问题本人已测试通过。

 

      本例使用struts2框架,导入jfreechart-1.0.13.jar和struts2-jfreechart-plugin-2.2.1.1.jar

 

1.带热点饼图的Action

com.milton.hot.FirstChart

 

package com.milton.hot;

import java.awt.Color;
import java.awt.Font;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.StandardPieURLGenerator;
import org.jfree.data.general.DefaultPieDataset;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 
 * 带热点的饼图
 * @author Milton
 *
 */
public class FirstChart extends ActionSupport
{
    private String mapMessage;
    private String src;
    /**
     * 生成饼图
     */
    public String execute() throws Exception
    {
        //设置数据
        DefaultPieDataset data = new DefaultPieDataset();
        data.setValue("三星I9000", 10000);
        data.setValue("HTC G7", 20000);
        data.setValue("HTC G2", 15000);
        data.setValue("诺基亚5230", 16000);
        data.setValue("摩托罗拉ME525", 50000);
        //生成JFreeChart对象
        JFreeChart chart = ChartFactory
                .createPieChart3D("手机销量统计图", data, true, true, true);

        chart.setTitle(new TextTitle("手机销量统计图", new Font("隶书", Font.BOLD, 25)));
        //建一个图例
        LegendTitle legendTitle = chart.getLegend(0);
        //设置图例字体
        legendTitle.setItemFont(new Font("宋体",Font.BOLD,14));
        
        PiePlot plot = (PiePlot) chart.getPlot();
        
        //根据key指定各个数据饼图的颜色
        plot.setSectionPaint("三星I9000", Color.RED);
        plot.setSectionPaint("HTC G7", Color.BLUE);
        plot.setSectionPaint("HTC G2", Color.GREEN);
        plot.setSectionPaint("诺基亚5230", Color.ORANGE);
        plot.setSectionPaint("摩托罗拉ME525", Color.GRAY);
        //设置plot字体
        plot.setLabelFont(new Font("宋体",Font.BOLD,18));
        //设置背景透明度(0~1)
        plot.setBackgroundAlpha(0.1f);
        
        //设置热点
        plot.setNoDataMessage("No data available");
        plot.setURLGenerator(new StandardPieURLGenerator("second.jsp", "type"));
        plot.setToolTipGenerator(new StandardPieToolTipGenerator()); 
        
        StandardEntityCollection sec = new StandardEntityCollection();

        //生成RenderingInfo实例,info参数就是图片的热点信息
        ChartRenderingInfo info = new ChartRenderingInfo(sec); 
        HttpServletRequest request = ServletActionContext.getRequest();
        String filename = ServletUtilities.saveChartAsJPEG(chart, 750, 300, info, request.getSession());
        mapMessage = ChartUtilities.getImageMap("map0", info);
        src = request.getContextPath()+"/DisplayChart?filename=" + filename;
        return "first";
    }
    public void setMapMessage(String mapMessage)
    {
        this.mapMessage = mapMessage;
    }
    public void setSrc(String src)
    {
        this.src = src;
    }
    public String getMapMessage()
    {
        return mapMessage;
    }
    public String getSrc()
    {
        return src;
    }
    
}

 2.热点链接进去后的柱状图的Action

com.milton.hot.SecondChart

 

package com.milton.hot;

import java.awt.Color;
import java.awt.Font;

import javax.servlet.http.HttpServletRequest;

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.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;

import com.opensymphony.xwork2.ActionSupport;

public class SecondChart extends ActionSupport
{
    private JFreeChart chart;
    
    /**
     * 生成柱状图
     */
    public String execute() throws Exception
    {
        HttpServletRequest request = ServletActionContext.getRequest();
        String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");
        
        if(type.equals("Java"))
        {
            //根据类型做不同处理
        }
        
        //中文必须设置字体,否则页面显示小方块
        Font xfont = new Font("宋体", Font.PLAIN, 20);// X轴  
        Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴  
        Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部  
        Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题  

        DefaultCategoryDataset data = new DefaultCategoryDataset();
        data.addValue(15000, "", "第一季度");
        data.addValue(10000, "", "第二季度");
        data.addValue(20000, "", "第三季度");
        data.addValue(5000, "", "第四季度");
        
        chart = ChartFactory.createBarChart3D(
                type+"季度销量统计图",//图表标题
                "季度",//横轴显示标签  
                "销量",//纵轴显示标签  
                data,//数据集
                PlotOrientation.VERTICAL,//设置图表方向 (水平、垂直)
                false,//是否显示图例(对于简单的柱状图必须是false)
                false,//是否生成工具
                true//是否生成URL链接
                );

        //设置标题  
        chart.setTitle(new TextTitle(type+"季度销量统计图", titleFont));

        //设置图表部分
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setForegroundAlpha(0.5f);
        CategoryAxis categoryAxis = plot.getDomainAxis();//取得横轴
        categoryAxis.setTickLabelFont(xfont);//设置横轴分类标签字体  
        categoryAxis.setLabelFont(xfont);//设置横轴显示标签的字体
        categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);//分类标签以45度倾斜

        NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();//取得纵轴
        numberAxis.setTickLabelFont(yfont);//设置纵轴分类标签字体  
        numberAxis.setLabelFont(yfont);//设置纵轴显示标签字体

        //渲染柱子
        BarRenderer3D render = (BarRenderer3D) plot.getRenderer();
        render.setSeriesPaint(0, Color.blue);//设置柱子颜色
        render.setSeriesPaint(1, Color.BLUE);
        render.setSeriesPaint(2, Color.RED);
        render.setSeriesPaint(3, Color.GREEN);
        render.setItemMargin(0.5);//设置柱子间隔
        render.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        render.setBaseItemLabelsVisible(true);//显示每个柱子的数值
        plot.setRenderer(render);
        return SUCCESS;
    }

    public JFreeChart getChart()
    {
        return chart;
    }

    public void setChart(JFreeChart chart)
    {
        this.chart = chart;
    }
    
}

 3.web.xml配置

 

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

 4.struts.xml配置

 

        <action name="firstChart" class="com.milton.hot.FirstChart">
                <result name="first">/first.jsp</result>
        </action>
        <action name="secondChart" class="com.milton.hot.SecondChart">
         <result type="chart">
         	<param name="width">500</param>
		<param name="height">500</param>
		<param name="imageType">jpg</param>
         </result>
        </action>

 5.first.jsp的<body>中添加如下代码

 

<p align="center">
<s:property value="mapMessage" escape="false"/>
<img src="<s:property value='src'/>" border=0 usemap="#map0">
</p>

 6.second.jsp(热点链接进入后的柱状图页面)

 

<body>
<!-- 得到饼图热点类型 -->
<%
    String type = request.getParameter("type");
    String str = new String(type.getBytes("ISO_8859_1"), "utf-8");
%>
<%=str%>
<p align="center"><img
	src="<%=request.getContextPath()%>/secondChart.action?type=<%=str%>">
</p>
</body>

 7.部署在web服务器后运行

 8.浏览器输入http://10.0.0.46:8080/JFreeChart/firstChart.action后即可看到first.jsp中带热点的饼图

 9.点击热点区域即可看到对应的柱状图

分享到:
评论
1 楼 赵武艺 2012-07-19  
我按照你写的demo,项目怎么运行不起来啊?你的demo可以给我发一份吗?wuyixiwen@sina.com谢谢!

相关推荐

    java jfreechart 生成图形报表 饼图,条形图,曲线图

    首先,我们来了解一下如何使用JFreeChart生成饼图。饼图是一种直观地表示各部分与整体之间比例关系的图形。在JFreeChart中,我们可以使用`PieChart`类来创建饼图。需要定义数据集,通常是`DefaultPieDataset`,然后...

    jfreechart 生成折线图,饼图,柱状图,堆栈柱状图

    JFreeChart是一个流行的Java库,用于生成各种类型的图表,包括折线图、饼图和柱状图,甚至堆栈柱状图。这个压缩包中的"CreateChartServiceImpl.java"文件很可能包含了一个实现这些功能的服务类。 首先,我们要理解...

    java JXL导入导出Excel源码及jfreechart 生成折线图,饼图

    java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图

    JFreeChart生成饼图

    ### JFreeChart生成饼图知识点详解 #### 一、引言 在Web开发中,图表是一种非常有效的数据可视化工具,能够帮助用户更直观地理解数据。`JFreeChart`是Java平台上的一个开源图表库,提供了丰富的图表类型,包括柱状...

    JFreeChart生成饼图最简单demo.

    本文将详细介绍如何使用JFreeChart生成饼图,包括所需环境、基本代码实现及关键步骤。 ### 一、环境准备 要使用JFreeChart生成饼图,首先需要确保项目环境中包含了JFreeChart的依赖。通常,这涉及到添加JFreeChart...

    jfreechart 生成折线图,饼图,柱状图,堆栈柱状图

    标题中提到的“jfreechart生成折线图、饼图、柱状图、堆栈柱状图”是指使用Java的一个开源图形库JFreeChart来创建不同类型的统计图表。JFreeChart是一个功能全面、成熟的Java图表库,广泛应用于各种应用程序中进行...

    struts2+MySQL+jfreechart生成带热点

    在"struts2+MySQL+jfreechart生成带热点"的场景中,我们可以构建一个Web应用,该应用能够从MySQL数据库中检索数据,然后使用JFreeChart生成包含热点的图表。热点是指图表上的区域,当用户点击这些区域时,可以触发...

    jfreechart_生成折线图,饼图,柱状图,堆栈柱状图

    使用 jfreechart 生成饼图需要以下步骤: 1. 创建 DefaultPieDataset 对象,用于存储数据。 2. 创建 PiePlot3D 对象,用于设置饼图的样式。 3. 使用 ChartFactory 创建饼图,passing in the dataset object. 4. ...

    jfreechart 图形折线,饼图,柱状图等

    JFreeChart 是一个广泛使用的开源 Java 图形库,它允许开发人员轻松地创建各种图表,包括折线图、饼图和柱状图。这个库为 Java 应用程序提供了丰富的图表功能,适用于数据可视化的需求,无论是简单的报告还是复杂的...

    纯Java动态生成SVG饼图与JFreeChart超强功能生成SVG图表

    纯Java动态生成 SVG 饼图与 JFreeChart 超强功能生成 SVG 图表 在本文中,我们将探讨如何使用 Java 生成 SVG 饼图,并使用 JFreeChart 生成 SVG 图表。我们还将讨论 JFreeChart 的一些缺陷和解决方案。 一、Java ...

    jfreechart 曲线图 3d饼图 3d柱状图

    **JFreeChart库详解:创建3D曲线图、3D饼图和3D柱状图** JFreeChart是一个强大的Java图形库,它提供了多种图表类型,包括曲线图、饼图和柱状图,且支持2D和3D效果。本篇文章将深入探讨如何使用JFreeChart来创建这些...

    jfreechart(柱状图,饼状图...)教程.zip

    这个教程可能是为了帮助用户理解如何利用JFreeChart来生成柱状图、饼状图等常见类型的图表。下面我们将深入探讨JFreeChart的基本使用、柱状图和饼状图的创建方法,以及如何结合源码进行学习。 首先,JFreeChart库...

    20201012JFreeChart生成饼图和环图技术.zip

    在20201012JFreeChart生成饼图和环图技术分享中,你将找到具体的代码示例和详细步骤,帮助你理解和应用这些技术。通过学习这个教程,你可以熟练地使用JFreeChart为你的Java应用增添丰富的可视化元素,使数据的呈现...

    jfreechart生成各种图表

    jfreechart生成各种图表 柱状 饼状 折线 锥状

    jfreechart生成图片及导出pdf 、excel

    下面是生成饼图并导出为PDF的基本代码片段: ```java CategoryDataset dataset = createDataset(); JFreeChart chart = ChartFactory.createPieChart("饼图示例", dataset); File outputFile = new File(...

    JFreeChart生成图片并显示

    《JFreeChart生成图片并显示》 在Java开发中,我们常常需要生成各种图表来直观地展示数据,比如折线图、柱状图、饼图等。JFreeChart是一个强大的开源Java库,它提供了丰富的图表生成功能,可以满足开发者在各种应用...

    JfreeChart柱状图饼图

    JFreeChart库是开源的Java图形库,提供了一套完整的API,支持生成各种复杂图表,如折线图、柱状图、饼图、散点图、甘特图等。它的设计目标是易于使用、可扩展且功能强大,使得开发者无需深入了解图形渲染机制,就能...

Global site tag (gtag.js) - Google Analytics