JfreeChart的使用 小强斋

JfreeChart的使用

一、JFreeChart 项目简介

JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等。JFreeChart可以方便的与Swing相结合使用,还可以导入到Web页面中,更是可以方便的利用其工厂方法将图表写入jpeg或者png格式的图片中

官     网   :http://www.jfree.org/jfreechart/index.html

下载地址 :http://sourceforge.net/projects/jfreechart/files/

API         :  http://www.jfree.org/jfreechart/api/javadoc/index.html

二、JFreeChart 核心类库介绍:

研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形 本身有关,后者与图形显示的数据有关。核心类主要有:
org.jfree.chart.JFreeChart :图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

三、建立jfreechart的主要步骤

要建立一个JFreeChart图形主要有以下个步骤(以柱图为例):

第一步:建立DataSet数据源
第二步:创造JFreeChart
第三步:设置图形显示的属性
第四步:写入图片或输出界面利用

四、开发例子

4.1直接生成图片

PieChartPicture.java

import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

public class PieChartPicture {
	public static void main(String[] args) {
		PieDataset dataset = getDataSet();
		JFreeChart chart = ChartFactory.createPieChart3D(" 项目进度分布", // chart title
				dataset,// data
				true,// include legend
				true, false);
		PiePlot3D plot = (PiePlot3D) chart.getPlot();
		// 图片中显示百分比:默认方式
        //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
		// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
		// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
		plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));
		// 设置背景色为白色
		chart.setBackgroundPaint(Color.white);
		// 指定图片的透明度(0.0-1.0)
		plot.setForegroundAlpha(1.0f);
		// 指定显示的饼图上圆形(false)还椭圆形(true)
		plot.setCircular(true);
		// 设置图标题的字体
		Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
		TextTitle title = new TextTitle(" 项目状态分布");
		title.setFont(font);
		chart.setTitle(title);
		//设置图中图例的字体
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
        // 设置图下面图例的字体
		LegendTitle legend = chart.getLegend();
		legend.setItemFont(new Font("宋体", Font.BOLD, 14));

		FileOutputStream fos_jpg = null;
		try {
			fos_jpg = new FileOutputStream("D:\\项目状态分布.jpg");
			ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 640, 480,null);
			fos_jpg.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static PieDataset getDataSet() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("市场前期", new Double(10));
		dataset.setValue("立项", new Double(15));
		dataset.setValue("计划", new Double(10));
		dataset.setValue("需求与设计", new Double(10));
		dataset.setValue("执行控制", new Double(35));
		dataset.setValue("收尾", new Double(10));
		dataset.setValue("运维", new Double(10));
		return dataset;
	}
}

4.2 ApplicationFrame 方式

import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class PieChartDemo_ApplicationFrame extends ApplicationFrame { 

public PieChartDemo_ApplicationFrame(String title) { 
super(title); 
setContentPane(createDemoPanel()); 
} 
private static JFreeChart createChart(PieDataset dataset) { 
JFreeChart chart = ChartFactory.createPieChart3D( " 项目进度分布", // chart title
		dataset,// data
		true,// include legend
		true, false);
PiePlot3D plot = (PiePlot3D) chart.getPlot();
// 图片中显示百分比:默认方式
//plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));
// 设置背景色为白色
chart.setBackgroundPaint(Color.white);
// 指定图片的透明度(0.0-1.0)
plot.setForegroundAlpha(1.0f);
// 指定显示的饼图上圆形(false)还椭圆形(true)
plot.setCircular(true);
// 设置图标题的字体
Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
TextTitle title = new TextTitle(" 项目状态分布");
title.setFont(font);
chart.setTitle(title);
//设置图中图例的字体
plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
// 设置图下面图例的字体
LegendTitle legend = chart.getLegend();
legend.setItemFont(new Font("宋体", Font.BOLD, 14));


return chart; 
} 

public static JPanel createDemoPanel() { 
JFreeChart chart = createChart(createDataset()); 
return new ChartPanel(chart); 
} 

private static  PieDataset createDataset() {
	DefaultPieDataset dataset = new DefaultPieDataset();
	dataset.setValue("市场前期", new Double(10));
	dataset.setValue("立项", new Double(15));
	dataset.setValue("计划", new Double(10));
	dataset.setValue("需求与设计", new Double(10));
	dataset.setValue("执行控制", new Double(35));
	dataset.setValue("收尾", new Double(10));
	dataset.setValue("运维", new Double(10));
	return dataset;
}

public static void main(String[] args) { 
PieChartDemo_ApplicationFrame demo = new PieChartDemo_ApplicationFrame("Pie Chart Demo 1"); 
demo.pack(); 
RefineryUtilities.centerFrameOnScreen(demo); 
demo.setVisible(true); 
} 
} 

4.3  jsp+servlet+javabean方式

jsp页面,调用javabean的方法生成chart,并将 chart以BufferedImage形式写入session。session.setAttribute("chartImage", chartImage);

在servlet中获得chart,  BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");设置response.setContentType("image/png");

页面调用servlet显示图片。<img src="http://localhost:8080/jfreechart/servlet/ChartViewer" border=0 >

创建servlet

package com.ncepu;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.keypoint.PngEncoder;

public class ChartViewer extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 从session 中获得chart
		HttpSession session = request.getSession();
		BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");
		// 设置 content type so the browser can see this as a picture
		response.setContentType("image/png");
		// send the picture
		PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);
		response.getOutputStream().write(encoder.pngEncode());
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}


	public void doPut(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}


	public void destroy() {
	}
}

配置servlet

	<servlet>
		<servlet-name>ChartViewer</servlet-name>
		<servlet-class>com.ncepu.ChartViewer</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ChartViewer</servlet-name>
		<url-pattern>/servlet/ChartViewer</url-pattern>
	</servlet-mapping>

javabean中生成chart

package com.ncepu;

import java.awt.Color;
import java.awt.image.BufferedImage;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

public class Pie3DDemo {
	// 生成数据集
	private DefaultPieDataset getDataset() {
		String[] section = new String[] { "Jan", "Feb", "Mar", "Apr", "May",
				"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
		double[] data = new double[section.length];
		for (int i = 0; i < data.length; i++) {
			data[i] = 10 + (Math.random() * 10);
		}
		DefaultPieDataset dataset = new DefaultPieDataset();
		for (int i = 0; i < data.length; i++) {
			dataset.setValue(section[i], data[i]);
		}
		return dataset;
	}

	public String getChartViewer(HttpServletRequest request,HttpServletResponse response) {
		DefaultPieDataset dataset = getDataset();
		// 生产chart
		JFreeChart chart = ChartFactory.createPieChart3D("Pie3D Chart Demo",dataset, true, true, false);
		// 设置背景色
		chart.setBackgroundPaint(Color.cyan);
		PiePlot plot = (PiePlot) chart.getPlot();
		plot.setNoDataMessage("No data available");
		plot.setLabelGenerator(null);

		ChartRenderingInfo info = null;
		HttpSession session = request.getSession();
		try {
			// Create RenderingInfo object
			response.setContentType("text/html");
			info = new ChartRenderingInfo(new StandardEntityCollection());
			BufferedImage chartImage = chart.createBufferedImage(640, 400, info);
			// 将 chart以BufferedImage形式写入session,
			session.setAttribute("chartImage", chartImage);
		} catch (Exception e) {
		}
		
		String pathInfo = "http://";
		pathInfo += request.getServerName();
		int port = request.getServerPort();
		pathInfo += ":" + String.valueOf(port);
		pathInfo += request.getContextPath();
		String chartViewer = pathInfo + "/servlet/ChartViewer";
		return chartViewer; 
	}
}

页面index.jsp

<html> 
<head> 
<title>Pie Chart Demo 1</title> 
</head> 
<jsp:useBean id="myChart" scope="session" class="com.ncepu.Pie3DDemo" /> 
<body> 
<h2>Pie Chart Demo</h2> 
<%String chartViewer = myChart.getChartViewer(request, response);%> 
<img src="<%=chartViewer%>" border=0 > 
<img src="http://localhost:8080/jfreechart/servlet/ChartViewer" border=0 > 
</body> 
</html> 

4.4  web应用中推荐方式---->配置DisplayChart

package jfree;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;

import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;

/**
 * 曲线图的绘制
 */
public class LineXYChart {
	/**
	 * 返回生成图片的文件名
	 * 
	 * @param session
	 * @param pw
	 * @return 生成图片的文件名
	 */
	public String getLineXYChart(HttpSession session, PrintWriter pw) {
		
		

		XYDataset dataset = this.createDateSet();// 建立数据集
		String fileName = null;
		// 建立JFreeChart
		JFreeChart chart = ChartFactory.createTimeSeriesChart("JFreeChart时间曲线序列图", // title
				"Date", // x-axis label
				"Price", // y-axis label
				dataset, // data
				true, // create legend?
				true, // generate tooltips?
				false // generate URLs?
				);
		// 设置JFreeChart的显示属性,对图形外部部分进行调整
		chart.setBackgroundPaint(Color.red);// 设置曲线图背景色
		// 设置字体大小,形状
		Font font = new Font("宋体", Font.BOLD, 16);
		TextTitle title = new TextTitle("JFreeChart时间曲线序列图", font);
		chart.setTitle(title);
		// 副标题
		TextTitle subtitle = new TextTitle("副标题", new Font("黑体", Font.BOLD, 12));
		chart.addSubtitle(subtitle);
		chart.setTitle(title); // 标题
		// 设置图示标题字符
		// TimeSeries s1 = new TimeSeries("历史曲线", Day.class);该中文字符
		LegendTitle legengTitle = chart.getLegend();
		legengTitle.setItemFont(font);
		XYPlot plot = (XYPlot) chart.getPlot();// 获取图形的画布
		plot.setBackgroundPaint(Color.lightGray);// 设置网格背景色
		plot.setDomainGridlinePaint(Color.green);// 设置网格竖线(Domain轴)颜色
		plot.setRangeGridlinePaint(Color.white);// 设置网格横线颜色
		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));// 设置曲线图与xy轴的距离
		plot.setDomainCrosshairVisible(true);
		plot.setRangeCrosshairVisible(true);
		XYItemRenderer r = plot.getRenderer();
		if (r instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
			renderer.setBaseShapesVisible(true);
			renderer.setBaseShapesFilled(true);
			renderer.setShapesVisible(true);// 设置曲线是否显示数据点
		}
		// 设置Y轴
		NumberAxis numAxis = (NumberAxis) plot.getRangeAxis();
		NumberFormat numFormater = NumberFormat.getNumberInstance();
		numFormater.setMinimumFractionDigits(2);
		numAxis.setNumberFormatOverride(numFormater);
		// 设置提示信息
		StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator("历史信息{1} 16:00,{2})",
				new SimpleDateFormat("MM-dd"), numFormater);
		r.setToolTipGenerator(tipGenerator);
		// 设置X轴(日期轴)
		DateAxis axis = (DateAxis) plot.getDomainAxis();
		axis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
		ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
		try {
			fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);// 生成图片
		
		} catch (IOException e) {
			e.printStackTrace();
		}
		pw.flush();
		return fileName;// 返回生成图片的文件名
	}

	/**
	 * 建立生成图形所需的数据集
	 * 
	 * @return 返回数据集
	 */
	private XYDataset createDateSet() {
		TimeSeriesCollection dataset = new TimeSeriesCollection();// 时间曲线数据集合
		TimeSeries s1 = new TimeSeries("历史曲线", Day.class);// 创建时间数据源,每一个//TimeSeries在图上是一条曲线
		// s1.add(new Day(day,month,year),value),添加数据点信息
		s1.add(new Day(1, 2, 2006), 123.51);
		s1.add(new Day(2, 2, 2006), 122.1);
		s1.add(new Day(3, 2, 2006), 120.86);
		s1.add(new Day(4, 2, 2006), 122.50);
		s1.add(new Day(5, 2, 2006), 123.12);
		s1.add(new Day(6, 2, 2006), 123.9);
		s1.add(new Day(7, 2, 2006), 124.47);
		s1.add(new Day(8, 2, 2006), 124.08);
		s1.add(new Day(9, 2, 2006), 123.55);
		s1.add(new Day(10, 2, 2006), 122.53);
		dataset.addSeries(s1);
		dataset.setDomainIsPointsInTime(true);
		return dataset;
	}
}

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

jsp页面

<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>

<%@ page import="java.io.PrintWriter"%> <%@page import="jfree.LineXYChart;"%> <%  jfree.LineXYChart xyChart = new jfree.LineXYChart();  String fileName = xyChart.getLineXYChart(session, new PrintWriter(out));  String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName; %> <html>  <head>  <title>JFreeChart使用例子</title>  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  </head>  <body>   <img src="<%=graphURL%>" width=500 height=300 border=0>  </body> </html>

访问jp页面结果
 

 五、图片热点

plot.setURLGenerator(new StandardPieURLGenerator("PingImage2.jsp","type"));//设定链接

生成图片后  ChartUtilities.writeImageMap(pw, "map0", info,true);

页面  <img src="<%=graphURL%>" width=500 height=300 border=0 usemap="#map0" />

例子代码:

package jfree;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.StandardPieURLGenerator;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

/**
 * 曲线图的绘制
 */
public class PieChart {
	/**
	 * 返回生成图片的文件名
	 * 
	 * @param session
	 * @param pw
	 * @return 生成图片的文件名
	 */
	
	public String getPieChart(HttpSession session, PrintWriter pw) {
		
		 String fileName = null;  
		PieDataset dataset = getDataSet();
		JFreeChart chart = ChartFactory.createPieChart3D(" 项目进度分布", // chart title
				dataset,// data
				true,// include legend
				true, false);
		PiePlot3D plot = (PiePlot3D) chart.getPlot();
		plot.setURLGenerator(new StandardPieURLGenerator("tohot.jsp",
		"type"));//设定链接 
		// 图片中显示百分比:默认方式
        //plot.setLabelGenerator(new StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
		// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
		// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
		plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));
		// 设置背景色为白色
		chart.setBackgroundPaint(Color.white);
		// 指定图片的透明度(0.0-1.0)
		plot.setForegroundAlpha(1.0f);
		// 指定显示的饼图上圆形(false)还椭圆形(true)
		plot.setCircular(true);
		// 设置图标题的字体
		Font font = new Font("宋体", Font.CENTER_BASELINE, 20);
		TextTitle title = new TextTitle(" 项目状态分布");
		title.setFont(font);
		chart.setTitle(title);
		//设置图中图例的字体
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
        // 设置图下面图例的字体
		LegendTitle legend = chart.getLegend();
		legend.setItemFont(new Font("宋体", Font.BOLD, 14));
		
		ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
		try {
			fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);// 生成图片
			ChartUtilities.writeImageMap(pw, "map0", info,true); 
		
		} catch (IOException e) {
			e.printStackTrace();
		}
		pw.flush();
		return fileName;// 返回生成图片的文件名
	}

	/**
	 * 建立生成图形所需的数据集
	 * 
	 * @return 返回数据集
	 */
	private static PieDataset getDataSet() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("市场前期", new Double(10));
		dataset.setValue("立项", new Double(15));
		dataset.setValue("计划", new Double(10));
		dataset.setValue("需求与设计", new Double(10));
		dataset.setValue("执行控制", new Double(35));
		dataset.setValue("收尾", new Double(10));
		dataset.setValue("运维", new Double(10));
		return dataset;
	}
}

index.jsp

<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>

<%@ page import="java.io.PrintWriter"%>
<%@page import="jfree.PieChart;"%>
<%
	jfree.PieChart pieChart = new jfree.PieChart();
	String fileName = pieChart.getPieChart(session, new PrintWriter(out));
	String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
%>
<html>
	<head>
	<title>JFreeChart热点例子</title>
	</head>
	<body>
		<img src="<%=graphURL%>" width=500 height=300 border=0 usemap="#map0" />
	</body>
</html>

tohot.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'PingImage.jsp' starting page</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>
  <% 
  request.setCharacterEncoding("ISO8859-1") ;  
  String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");  
 %>
  选择的类型为: <%=type %>

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

结果:

点击运行控制结果:

注意:

1、页面上的usemap="#map0"比保存时候ChartUtilities.writeImageMap(pw, "map0", info,true);多一个#号

2、注意乱码问题。 页面都是utf-8编码,而writeImageMap貌似用的ISO_8859_1

  request.setCharacterEncoding("ISO8859-1") ; 
  String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");

六、乱码问题

1、一种是中文显示为问号(?),这种情况一般是由于汉字编码转换出错。

2、一种是中文显示为方框(□),这种情况一般是由于jfreechart中用到的字体不存在。重新设置字体即可

使用JFreeChart绘制图表的时候,如果使用默认的字体会导致图标中的汉字显示为乱码。解决方法如下:

JFreeChart是用户使用该库提供的各类图标的统一接口,JFreeChart主要由三个部分构成:title(标题),legend(图释),plot(图表主体)。三个部分设置字体的方法分别如下:

1.Title

 TextTitle textTitle = freeChart.getTitle();  
  textTitle.setFont(new Font("宋体",Font.BOLD,20));

2.Legend

	LegendTitle legend = freeChart.getLegend();
		if (legend != null)

		{
			legend.setItemFont(new Font("宋体", Font.BOLD, 20));
		}

3.Plot

对于不同类型的图表对应Plot的不同的实现类,设置字体的方法也不完全相同。

对于使用CategoryPlot的图表(如柱状图):CategoryPlot plot = (CategoryPlot)freeChart.getPlot();

CategoryAxis domainAxis = plot.getDomainAxis();//(柱状图的x轴) 
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴坐标上的字体 
domainAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置x轴上的标题的字体 
ValueAxis valueAxis = plot.getRangeAxis();//(柱状图的y轴) 
valueAxis.setTickLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的字体 
valueAxis.setLabelFont(new Font("宋体",Font.BOLD,20));//设置y轴坐标上的标题的字体 

对于使用PiePlot的图标(如饼状图)

PiePlot plot = (PiePlot)freeChart.getPlot();   

plot.setLabelFont(new Font("宋体",Font.BOLD,15)); 


 

原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637478.html