JfreeChart学习总结 整理中。。。

[color=red]五.开始开发[/color]
前面的其实都是废话,呵呵。对JFreeChart的操作其实可以分成6步骤
[list=1]
[*]引入生成图表所需的Jar包
[*]创建绘制图表所需要的数据集
[*]创建JFreeChart的实例
[*]设置图表的生成格式及文件名
[*]设置图表的浏览路径
[*]在HTML中,调用<img>显示图表
[/list]

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.PlotOrientation;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.DefaultCategoryDataset;

public class ChartServelt extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;

public ChartServelt() {
super();
}

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

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第二步,创建绘制数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
int bookSales=0;
String[] xAxis= new String[10];
String[] yAxis= new String[20];
xAxis[0] = 999+"";
for(int i=0;i<xAxis.length;i++){
xAxis[i]=i+"";
for(int j=0;j<yAxis.length;j++){
yAxis[j]=j+"";
bookSales = 1 +(int)(Math.random()*100);
dataset.addValue(bookSales, xAxis[0], yAxis[j]);
}
}
//第三步,创建JFreeChart实例
String chartTile = "Hello,JFreeChart";
JFreeChart chart = ChartFactory.createLineChart(
chartTile, //图表的标题
"XAxis", //x轴标题
"YAxis", //y轴标题
dataset, //数据集
PlotOrientation.VERTICAL, //直方图的方向,水平方向和垂直方向
true, //是否有图例
true, //是否有提示
true); //是否有连接
//第四步,图表的格式和文件名
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
String fileName = ServletUtilities.saveChartAsPNG(chart,827, 290, info,request.getSession());
//第五步,浏览路径
String graphURL = request.getContextPath()+"/servlet/DisplayChart?filename="+fileName;
request.getRequestDispatcher("test.jsp?graphURL="+graphURL).forward(request, response);
}
}


记住以上6步骤,无论做什么形状的图表,都是在某一步的扩展。

1) 直接生成图片


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);
FileOutputStream fos_jpg = null;
try {
fos_jpg=new FileOutputStream("D:\\ 项目状态分布.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,640,480,null);
fos_jpg.close();
} catch (Exception e) {
}
}
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;
}
}



2) 采用servlet和struts的action方式输出
采用这种方式输出,不用生成图片。
A .servlet输出

public class PieByServlet extends HttpServlet{    
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
res.setContentType("image/jpeg");
PieDataset dataset = getDataSet();
JFreeChart chart = ChartFactory.createPieChart3D(
" 水果饼图", // chart title
dataset,// data
true, // include legend
true,
false );
//设置图表属性
// 输出图片
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,800,600,null);
}

B .struts的action方式输出
只将这条语句加上try catch即可,并返回null。


try{          
ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);
} catch (Exception e) {
}
return null;

try{
ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);
} catch (Exception e) {
}
return null;


其实采用这两种方式与生成图片的方式改动并不大
加上语句response.setContentType("image/jpeg");
ChartUtilities.writeChartAsJPEG(new FileOutputStream("D:\\ 项目状态分布.jpg");,100,chart,640,480,null);
文件流改成response的输出流就可以了
hartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);

3)jsp+servlet+javabean方式
1. Create ChartViewer servlet

public class ChartViewer extends HttpServlet {    
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get the chart from session
HttpSession session = request.getSession();
BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");
// set the 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());
}
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//Process the HTTP Put request
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//Clean up resources
public void destroy() { }
}

public class ChartViewer extends HttpServlet {
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get the chart from session
HttpSession session = request.getSession();
BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");
// set the 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());
}
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//Process the HTTP Put request
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//Clean up resources
public void destroy() { }
}


2. Create a servlet map in web.xml


<?xml version="1.0" encoding="UTF-8"?>    
<web-app>
<servlet>
<servlet-name>ChartViewer</servlet-name>
<servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChartViewer</servlet-name>
<url-pattern>/servlet/ChartViewer</url-pattern>
</servlet-mapping>
</web-app>

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>ChartViewer</servlet-name>
<servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChartViewer</servlet-name>
<url-pattern>/servlet/ChartViewer</url-pattern>
</servlet-mapping>
</web-app>


3. Create a chart in a java bean (Pie3DDemo.java)


public class Pie3DDemo {    
private DefaultPieDataset getDataset() {
// categories...
String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" };
// data...
double[] data = new double[section.length];
for (int i = 0; i < data.length; i++) {
data[i] = 10 + (Math.random() * 10);
}
// create the dataset...
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();
// create the chart...
<SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPie3DChart(
"Pie3D Chart Demo", // chart title
dataset, // data
true, // include legend
true,
false
);
// set the background color for the chart...
chart.setBackgroundPaint(Color.cyan);
PiePlot plot = (PiePlot) chart.getPlot();
plot.setNoDataMessage("No data available");
// set drilldown capability...
plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section"));
plot.setLabelGenerator(null);
// OPTIONAL CUSTOMISATION <SPAN class=hilite3>COM</SPAN>PLETED.
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);
// putting chart as BufferedImage in session,
// thus making it available for the image reading action Action.
session.setAttribute("chartImage", chartImage);
PrintWriter writer = new PrintWriter(response.getWriter());
ChartUtilities.writeImageMap(writer, "imageMap", info);
writer.flush();
} 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;
}

public class Pie3DDemo {
private DefaultPieDataset getDataset() {
// categories...
String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" };
// data...
double[] data = new double[section.length];
for (int i = 0; i < data.length; i++) {
data[i] = 10 + (Math.random() * 10);
}
// create the dataset...
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();
// create the chart...
JFreeChart chart = ChartFactory.createPie3DChart(
"Pie3D Chart Demo", // chart title
dataset, // data
true, // include legend
true,
false
);
// set the background color for the chart...
chart.setBackgroundPaint(Color.cyan);
PiePlot plot = (PiePlot) chart.getPlot();
plot.setNoDataMessage("No data available");
// set drilldown capability...
plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section"));
plot.setLabelGenerator(null);
// OPTIONAL CUSTOMISATION COMPLETED.
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);
// putting chart as BufferedImage in session,
// thus making it available for the image reading action Action.
session.setAttribute("chartImage", chartImage);
PrintWriter writer = new PrintWriter(response.getWriter());
ChartUtilities.writeImageMap(writer, "imageMap", info);
writer.flush();
} 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;
}


6. 页面



<html>    
<head>
<title>Pie Chart Demo</title>
</head>
<jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" />
<body>
<h2>Pie Chart Demo</h2>
<%String chartViewer = myChart.getChartViewer(request, response);%>
<img src="<%=chartViewer%>" border=0 usemap="#imageMap">
</body>
</html>


<html>
<head>
<title>Pie Chart Demo</title>
</head>
<jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" />
<body>
<h2>Pie Chart Demo</h2>
<%String chartViewer = myChart.getChartViewer(request, response);%>
<img src="<%=chartViewer%>" border=0 usemap="#imageMap">
</body>
</html>


4)采用工具类ChartUtil和DisplayChart(jfreechart的servlet)输出
我用了上面的几个方法输出图片,发现页面里只能输出一个图片,
不过下面的方法可以输出多个图片,而且是几种方式中最简单的一个,推荐使用。

这种方式和上面的三种比较类似,是将javabean里的生成图片的方法写的一个工具类ChartUtil里面。

1 .添加工具类ChartUtil
public class ChartUtil {
// 产生时间序列图,返回图片名称


public  static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {    

String filename = null;
try {
if (session != null)
{
ChartDeleter deleter = (ChartDeleter)session.getAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter");
session.removeAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter");
session.setAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter", deleter);
}
<SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPieChart3D(
title, // chart title
dataset, // data
true, // include legend
true,
false );
// Write the chart image to the temporary directory
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
//If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.
//If the last parameter is a session object, the chart remains until session time out.
filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info,true);
pw.flush();
} catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "picture_error.png"; }
return filename;
}
}

public static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {

String filename = null;
try {
if (session != null)
{
ChartDeleter deleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");
session.removeAttribute("JFreeChart_Deleter");
session.setAttribute("JFreeChart_Deleter", deleter);
}
JFreeChart chart = ChartFactory.createPieChart3D(
title, // chart title
dataset, // data
true, // include legend
true,
false );
// Write the chart image to the temporary directory
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
//If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.
//If the last parameter is a session object, the chart remains until session time out.
filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info,true);
pw.flush();
} catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "picture_error.png"; }
return filename;
}
}



2、在action里统计数据,设置好数据集dataset。传到页面

3、 在页面里取出
DefaultPieDataset piedataset=(DefaultPieDataset)request.getAttribute("piedataset");
// 用ChartUtil工具类产生图片
Java代码
String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,null, new PrintWriter(out));
String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;

String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,null, new PrintWriter(out));
String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;
通过以下方式输出

<td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>  

<td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>

4、在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>

<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>


5) ApplicationFrame 方式

public class PieChartDemo1 extends ApplicationFrame {    
public PieChartDemo1(String title) {
super(title);
setContentPane(createDemoPanel());
}
private static <SPAN class=hilite1>JFreeChart</SPAN> createChart(PieDataset dataset) {
<SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPieChart(
.......
return chart;
}

public static JPanel createDemoPanel() {
<SPAN class=hilite1>JFreeChart</SPAN> chart = createChart(createDataset());
return new ChartPanel(chart);
}

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

public class PieChartDemo1 extends ApplicationFrame {
public PieChartDemo1(String title) {
super(title);
setContentPane(createDemoPanel());
}
private static JFreeChart createChart(PieDataset dataset) {
JFreeChart chart = ChartFactory.createPieChart(
.......
return chart;
}

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

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


六. 可参考资料与网址

官方网站

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

官方论坛

http://www.jfree.org/phpBB2/index.php

API 文档

http://www.jfree.org/jfreechart/api/gjdoc/index.html

中文API

http://blog.sina.com.cn/u/405da78d010000ap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值