用jfreechat制作图形报表

    最近对jfreechat制作图形报表进行了总结,将一些要点记录下来,以备不时之需!
    JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
关联jar包
    jfreechart-1.0.11.jar、jcommon-1.0.14.jar

spring与jfreechart结合开发

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>/servlet/DisplayChart</url-pattern>
    </servlet-mapping>


当然,这里的URL前缀可以自己设置!

JFreeChartUtils。这里以折线图为例:
	public static String createLineChart(HttpSession session,
			CategoryDataset dataset, String title, String xtitle,
			String ytitle, int width, int height, PrintWriter pw) {
		String filename = "";

		JFreeChart jfreechart = ChartFactory.createLineChart(title, xtitle,
				ytitle, dataset, PlotOrientation.VERTICAL, true, true, true);

		jfreechart.setTitle(new TextTitle(title,
				new Font("黑体", Font.ITALIC, 20)));// 重新设置图表标题,改变字体

		jfreechart.getTitle().setFont(new Font("黑体", Font.ITALIC, 20)); // 解决标题乱码

		jfreechart.setBackgroundPaint(Color.white); // 设定背景色为白色

		CategoryPlot plot = (CategoryPlot) jfreechart.getPlot(); // 获得

		plot.setBackgroundPaint(Color.lightGray); // 设定图表数据显示部分背景色

		plot.setDomainGridlinePaint(Color.white); // 横坐标网格线白色

		plot.setDomainGridlinesVisible(true); // 网格线

		plot.setRangeGridlinePaint(Color.white); // 纵坐标网格线白色

		plot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); // 设定坐标轴与图表数据显示部分距离

		CategoryAxis categoryAxis = plot.getDomainAxis();// 取得横轴

		categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 设置分类标签以45度角倾斜

		Font font = new Font("宋体", Font.BOLD, 16);

		categoryAxis.setLabelFont(font);// 设置横轴显示标签的字体

		categoryAxis.setTickLabelFont(font); // 解决横坐标乱码

		NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();// 取得纵轴

		numberAxis.setLabelFont(font);// 设置纵轴显示标签的字体

		numberAxis.setTickLabelFont(font); // 解决纵坐标乱码

		numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 使纵坐标的最小单位格为整数

		numberAxis.setAutoRangeIncludesZero(true);

		StandardEntityCollection sec = new StandardEntityCollection();
		ChartRenderingInfo info = new ChartRenderingInfo(sec);

		try {
			filename = ServletUtilities.saveChartAsPNG(jfreechart, width,
					height, info, session);
			ChartUtilities.writeImageMap(pw, filename, info, false);
			pw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filename;
	}


这里需要说明的是关于中文乱码的问题,其实很简单,只要设置相应的字体就好了!有很多朋友对 ChartUtilities.writeImageMap(pw, filename, info, false);  这句代码有些疑惑,这里结合页面代码进行说明!

jsp代码:
  <img src="${file}" border=0 usemap="#${filename}">


生成的页面源码:
<map id="jfreechart-62526.png" name="jfreechart-62526.png">
<area shape="poly" coords="727,43,733,43,733,49,727,49,727,43,727,43" title="(在线用户数, 07-26 11:55) = 44" alt="" href="index.html?series=%E5%9C%A8%E7%BA%BF%E7%94%A8%E6%88%B7%E6%95%B0&amp;category=07-26+11%3A55"/>
<area .... />
</map>

<img src="/gameCenter/servlet/DisplayChart?filename=jfreechart-62526.png" border=0 usemap="#jfreechart-62526.png"> 



可以注意到img的usemap标签是关键点!usemap 属性将图像定义为客户端图像映射。图像映射指的是带有可点击区域的图像。详细资料请参考 img的usemap标签。如而生成的页面代码中<map>......</map>部分正是ChartUtilities.writeImageMap(pw, filename, info, false);所生成!这样当你鼠标移动到生成的图标的某一个部分时,就会显示对应的title,点击会跳转到相应的url等。

当然这里也会出现中文乱码的问题,解决办法也很简单,只要在response中做下编码设置就OK了!

response.setContentType("text/html;charset=UTF-8");
Writer out = response.getWriter();
PrintWriter pw=new PrintWriter(out);

你可能感兴趣的:(free)