最近項(xiàng)目中需要用到j(luò)freechart,以前只是簡(jiǎn)單的玩玩而已,一直沒(méi)有真正的應(yīng)用到實(shí)際項(xiàng)目中,今天在畫(huà)圖的時(shí)候可把自己折磨慘了,就一個(gè)小小的tooltip死活不出來(lái)。
我用的Spring + Struts,有很多人用jfreechart都是寫(xiě)的Servlet,其實(shí)用Struts是一樣的。
我起初在Struts的Action中使用org.jfree.chart.ChartUtilities。writeChartAsPNG(java.io.OutputStream out, JFreeChart chart, int width, int height) 方法,將生成的JFreeChart對(duì)象寫(xiě)到輸出流中,return自然是null,這樣做界面可以顯示Action寫(xiě)過(guò)來(lái)的圖片,但是沒(méi)有 tooltip的出現(xiàn)。后來(lái)我發(fā)現(xiàn)很多人都不是直接把圖片寫(xiě)到流中的,而是在JSP頁(yè)面通過(guò)<img>標(biāo)簽來(lái)顯示圖片的。于是我也使用了主流方式顯示圖片,使用chartName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);將圖片文件名設(shè)置請(qǐng)求屬性發(fā)給JSP頁(yè)面,頁(yè)面通過(guò)圖片標(biāo)簽顯示圖片,結(jié)果圖片依舊顯示正常,但是tooltip還是沒(méi)有出來(lái),由于剛剛用這東西,一點(diǎn)都不了解,于是開(kāi)以往項(xiàng)目中是如何寫(xiě)的,我發(fā)現(xiàn)別人的代碼中有這樣一行:ChartUtilities.writeImageMap(pw, chartName, info, false);這是將圖片地圖寫(xiě)到流中,而且頁(yè)面的圖片標(biāo)簽中也多了個(gè)usermap屬性,我仿佛有點(diǎn)清醒了,于是效仿著做了一下,tooltip果真出現(xiàn)了。
JSP代碼:
<%
JFreeChart chart = (JFreeChart)request.getAttribute("chart");
String chartName = Common.generateChart(chart, session, new PrintWriter(out), 760, 410);
%>
Common的generateChart方法就是放回圖片的文件名,并且將圖片地圖寫(xiě)入到當(dāng)前的流中。
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);

/** *//** 將圖片地圖寫(xiě)入PW中 */
ChartUtilities.writeImageMap(pw, chartName, info, false);
pw.flush();

} catch (Exception e)
{
e.printStackTrace();
}
return chartName;
}
起初我并沒(méi)有使用Common這個(gè)方法,而是直接將這個(gè)方法中的代碼寫(xiě)在了Struts的Action中,發(fā)現(xiàn)無(wú)效,而且在pw.flush()一行出現(xiàn)了異常,流這里太爛!哎!提示刷新后就不能再return了。于是去掉這行后圖片正常顯示,但沒(méi)有tooltip。我懷疑是Struts中用 response獲取的PrintWriter并不是返回到JSP中用out封裝的PrintWriter,根本就不是,還懷疑什么,這不是廢話嘛!所以在當(dāng)前流中并沒(méi)有圖片地圖,自然不顯示tooltip了。
顯示圖片的IMG標(biāo)簽
<img src="<%=request.getContextPath()%>/<%=chartName%>" height="100%" border=0 usemap="#<%=chartName%>" >