JfreeChart热点显示(鼠标提示)

JfreeChart热点显示(鼠标提示)   

 JfreeChart热点显示,就是将鼠标移到图片上时有信息显示,当鼠标移开时不再有信息显示,如图1。

要想实现该功能,首先必须得到一个map对象,通过<img>标签中的usemap属性来指定map对象。

<img src=”<%=localLink%>” usemap=”#<%=filename %>” />

JfreeChart热点显示(鼠标提示) - dilegencehe - dilegencehe的博客

图1

 

该图的原始map数据如下:

<map id="jfreechart-23971.png" name="jfreechart-23971.png">

<area shape="poly" coords="452,225,452,140,464,132,470,132,470,217,458,225,458,225" title="(珠海, 葡萄) = 190" alt="" nohref="nohref"/>

<area shape="poly" coords="377,225,377,47,389,39,395,39,395,217,383,225,383,225" title="(深圳, 菠萝) = 400" alt="" nohref="nohref"/>

<area shape="poly" coords="302,225,302,123,314,115,320,115,320,217,308,225,308,225" title="(江西, 香蕉) = 230" alt="" nohref="nohref"/>

<area shape="poly" coords="227,225,227,145,239,137,245,137,245,217,233,225,233,225" title="(南京, 西瓜) = 180" alt="" nohref="nohref"/>

<area shape="poly" coords="152,225,152,136,164,128,170,128,170,217,158,225,158,225" title="(上海, 橘子) = 200" alt="" nohref="nohref"/>

<area shape="poly" coords="77,225,77,181,89,173,95,173,95,217,83,225,83,225" title="(北京, 苹果) = 100" alt="" nohref="nohref"/>

</map>

这里面,shape是指热点的区域,本段中的poly是一个多边形,也有Rectangle等。Coords是这个多边形的坐标,通常是需要用工具生成,这里所展示的是JfreeChart自动生成的。Title=””中的内容便是mouse移到各个点时,展示出的信息,mouse移开后信息不再显示。(这里不需要再写别的代码,浏览器可以解析这部分数据,相当于将title的内容在onmouseover中显示。)

 

怎么获得map对象?当然是根据一个图象来生成对应的map对象。

在创建一个图表对象的时候有两个参数,这里用柱状图作比:

JFreeChart chart = ChartFactory.createBarChart3D("本月销售情况","项目","数额",data,PlotOrientation.VERTICAL,true,true,false);

两个参数就是这个方法中的最后两个参数,这两个参数都是boolean型。这两个参数意思分别是:是否创建工具提示(tooltips)以及是否生成URL。这两个参数分别对应着MAP中一个area的title属性以及href属性。

现在就是要生成map对象的问题了???,JFreeChart已经帮我们做好生成MAP对象的功能,为了生成MAP对象,就要引入另一个对象ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象(chart)直接生成MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo。下面是生成map对象的流程图:

JfreeChart热点显示(鼠标提示) - dilegencehe - dilegencehe的博客

 

如上图所示,ChartUtilities类是整个流程的核心,流程简单描述如下:首先创建一个ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsPNG()/writeChartAsJPEG()时作为最后一个参数传递进去,调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,有了这个对象我们还是没有办法获取具体的MAP数据,我们还必须借助于ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来。

具体实现代码如下index.jsp:

<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>

<%@page import="org.jfree.chart.entity.StandardEntityCollection"%>

<%@page import="org.jfree.chart.ChartRenderingInfo"%>

<%@page import="org.jfree.chart.ChartUtilities"%>

<%@page import="org.jfree.chart.servlet.ServletUtilities"%>

<%@page import="org.jfree.chart.JFreeChart"%>

<%@page import="org.jfree.chart.*"%>

<%@page import="org.jfree.data.category.DefaultCategoryDataset"%>

<%@page import="org.jfree.chart.entity.ChartEntity"%>

<%@page import="org.jfree.chart.plot.PlotOrientation"%>

<%@page import="java.awt.Shape"%>

<%@page import="java.awt.Rectangle"%>

<%@page import="java.io.*" %>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

   

    <title>JfreeChartTest</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

  </head>

  <body>

  <%

int width = 500;
       int height = 300;

    DefaultCategoryDataset data = new DefaultCategoryDataset();

    data.addValue(100,"北京", "苹果");

    data.addValue(200,"上海", "橘子");

    data.addValue(180,"南京", "西瓜");

    data.addValue(230,"江西", "香蕉");

    data.addValue(400,"深圳", "菠萝");

    data.addValue(190,"珠海", "葡萄");

    JFreeChart chart = ChartFactory.createBarChart3D("本月销售情况","项目","数额",

    data,PlotOrientation.VERTICAL,true,true,false);

    //chart.setBackgroundPaint(java.awt.Color.white);//可选,设置图片背景色

//在矩形框中显示信息

    Shape shape = new Rectangle(20, 10);

    ChartEntity entity = new ChartEntity(shape);

    StandardEntityCollection coll = new StandardEntityCollection();

    coll.add(entity);

    //该工具类上面没有介绍,在鼠标移动到图片时显示提示信息是用Map实现的,这些Map是用该类生成的。

    ChartRenderingInfo info = new ChartRenderingInfo(coll);

    PrintWriter pw = new PrintWriter(out);//输出MAP信息

//写入到输出流生成图像文件,同时把图片的具体信息放入ChartRenderingInfo的一个实例为以后生成Map提供信息 
           ChartUtilities.writeChartAsPNG(fout, chart, width, heigh, info);

    String filename = ServletUtilities.saveChartAsPNG(chart, width , height,

           info, session);//保存图表为文件

    //读取info对象,生成Map信息。这些信息写在pw的输出流中,这里的输出流就是Response.out,也就是直接输出到页面了

    ChartUtilities.writeImageMap(pw, filename, info, false);

// servletDisplayChart根据web.xml配置文件去调用org.jfree.chart.servlet类中的DisplayChart

    String graphURL = request.getContextPath()

           + "/servletDisplayChart?filename=" + filename;

  %>

 

<P ALIGN="center">

<img src="<%=graphURL%>" border="0" usemap="#<%=filename %>">

</P>

</body>

</html>

 

 

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>/servletDisplayChart</url-pattern>

  </servlet-mapping>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值