Posted on 2011-04-16 13:59
IceWee 阅读(922)
评论(0) 编辑 收藏 所属分类:
Java
最近项目中需要用到jfreechart,以前只是简单的玩玩而已,一直没有真正的应用到实际项目中,今天在画图的时候可把自己折磨惨了,就一个小小的tooltip死活不出来。
我用的Spring + Struts,有很多人用jfreechart都是写的Servlet,其实用Struts是一样的。
我起初在Struts的Action中使用org.jfree.chart.ChartUtilities。writeChartAsPNG(java.io.OutputStream out, JFreeChart chart, int width, int height) 方法,将生成的JFreeChart对象写到输出流中,return自然是null,这样做界面可以显示Action写过来的图片,但是没有 tooltip的出现。后来我发现很多人都不是直接把图片写到流中的,而是在JSP页面通过<img>标签来显示图片的。于是我也使用了主流方式显示图片,使用chartName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);将图片文件名设置请求属性发给JSP页面,页面通过图片标签显示图片,结果图片依旧显示正常,但是tooltip还是没有出来,由于刚刚用这东西,一点都不了解,于是开以往项目中是如何写的,我发现别人的代码中有这样一行:ChartUtilities.writeImageMap(pw, chartName, info, false);这是将图片地图写到流中,而且页面的图片标签中也多了个usermap属性,我仿佛有点清醒了,于是效仿着做了一下,tooltip果真出现了。
JSP代码:
<%
JFreeChart chart = (JFreeChart)request.getAttribute("chart");
String chartName = Common.generateChart(chart, session, new PrintWriter(out), 760, 410);
%>
Common的generateChart方法就是放回图片的文件名,并且将图片地图写入到当前的流中。
Java代码:
public static String generateChart(JFreeChart chart, HttpSession session,
PrintWriter pw, int width, int height) {
String chartName = "";
try {
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
chartName = ServletUtilities.saveChartAsPNG(chart, width, height,
info, session);
/** *//** 将图片地图写入PW中 */
ChartUtilities.writeImageMap(pw, chartName, info, false);
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
return chartName;
}
起初我并没有使用Common这个方法,而是直接将这个方法中的代码写在了Struts的Action中,发现无效,而且在pw.flush()一行出现了异常,流这里太烂!哎!提示刷新后就不能再return了。于是去掉这行后图片正常显示,但没有tooltip。我怀疑是Struts中用 response获取的PrintWriter并不是返回到JSP中用out封装的PrintWriter,根本就不是,还怀疑什么,这不是废话嘛!所以在当前流中并没有图片地图,自然不显示tooltip了。
显示图片的IMG标签
<img src="<%=request.getContextPath()%>/<%=chartName%>" height="100%" border=0 usemap="#<%=chartName%>" >