JfreeChart热点显示(鼠标提示)
JfreeChart热点显示,就是将鼠标移到图片上时有信息显示,当鼠标移开时不再有信息显示,如图1。
要想实现该功能,首先必须得到一个map对象,通过<img>标签中的usemap属性来指定map对象。
<img src=”<%=localLink%>” usemap=”#<%=filename %>” />
图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的内容在on
怎么获得map对象?当然是根据一个图象来生成对应的map对象。
在创建一个图表对象的时候有两个参数,这里用柱状图作比:
JFreeChart chart = ChartFactory.createBarChart3D("本月销售情况","项目","数额",da
两个参数就是这个方法中的最后两个参数,这两个参数都是boolean型。这两个参数意思分别是:是否创建工具提示(tooltips)以及是否生成URL。这两个参数分别对应着MAP中一个area的title属性以及href属性。
现在就是要生成map对象的问题了???,JFreeChart已经帮我们做好生成MAP对象的功能,为了生成MAP对象,就要引入另一个对象ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象(chart)直接生成MAP数据,它需要一个中间对象来过渡,这个对象就是ChartRenderingInfo。下面是生成map对象的流程图:
如上图所示,ChartUtilities类是整个流程的核心,流程简单描述如下:首先创建一个ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsPNG()/writeChartAsJPEG()时作为最后一个参数传递进去,调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,有了这个对象我们还是没有办法获取具体的MAP数据,我们还必须借助于ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来。
具体实现代码如下index.jsp:
<%@ page language="java" imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<%@page imp
<!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 da
da
da
da
da
da
da
JFreeChart chart = ChartFactory.createBarChart3D("本月销售情况","项目","数额",
da
//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>