Chinaunix首页 | 论坛 | 博客
  • 博客访问: 693135
  • 博文数量: 194
  • 博客积分: 3831
  • 博客等级: 中校
  • 技术积分: 1843
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-28 13:24
文章分类

全部博文(194)

文章存档

2012年(41)

2011年(42)

2010年(45)

2009年(66)

分类: Java

2011-05-16 11:16:32

1、首先需要下载JFreeChart包,目前最新的是jfreechart-1.0.10.jar,然后将下载的包放到WEB-INF/LIB/下面。

2、配置。web.xml文件中增加如下配置:

  <servlet>
          
<servlet-name>DisplayChartservlet-name>
          
<servlet-class>org.jfree.chart.servlet.DisplayChartservlet-class>
servlet>
<servlet-mapping>
          
<servlet-name>DisplayChartservlet-name>
          
<url-pattern>/DisplayCharturl-pattern>
servlet-mapping>

3、使用。做好上面的工作后就可以使用JFreeChart了。这里我们实现使用它来做曲线图,然后在web中显示。

3-1、首先需要创建数据集合,也就是指定需要用图标显示的数据是哪些。如果是做时间曲线,则数据集合的创建方法如下:

    dataset = new TimeSeriesCollection();//时间曲线数据集合

3-2、创建数据源。

    TimeSeries s1 = new TimeSeries("历史曲线", Second.class);//创建时间数据源,每一个

                                                             //TimeSeries在图上是一条曲线

                                                             //Second.class指横轴最小间隔为秒

   s1.add(new Second(10,10,10,10,10,2009),15.5);//添加时间2009-10-10 10:10:10,纵坐标值为15.5

   s1.add(new Second(11,10,10,10,10,2009),16.5);//添加时间2009-10-10 10:10:11,纵坐标值为16.5

   s1.add(new Second(12,10,10,10,10,2009),13.5);//添加时间2009-10-10 10:10:12,纵坐标值为13.5

3-3、将数据源添加到数据集合中。

   dataset.addSeries(s1);

 

4、创建好数据源后,就接着创建JFreeChart对象,JFreeChart对象 主要可以实现对显示界面进行设置。

  JFreeChart chart = ChartFactory.createTimeSeriesChart( //创建JFreeChart对象
 "JFreeChart时间曲线序列图", // title
 "日期", // x-axis label
 "值", // y-axis label
 dataset, // data (注:就是我们上面生成的数据集合)
 true, // create legend?
 true, // generate tooltips?
 false // generate URLs?
 );

//设置JFreeChart的显示属性,对图形外部部分进行调整
chart.setBackgroundPaint(Color.gray);//设置曲线图背景色

//设置字体大小,形状
Font font = new Font("宋体", Font.BOLD, 16);
TextTitle title = new TextTitle("趋势分析图", font); //标题
chart.setTitle(title);

//副标题
TextTitle subtitle = new TextTitle("副标题 ", new Font("黑体", Font.BOLD, 12)); //定义副标题
chart.addSubtitle(subtitle);
chart.setTitle(title); //标题

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);
}
//设置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);
//设置X轴(日期轴)
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
try
{
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 350, info,
session);//生成图片
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, fileName, info, false);
}
catch (IOException e)
{
e.printStackTrace();
}
pw.flush();
return fileName;//返回生成图片的文件名
}

将上诉代码封装在一个取名叫LineXYChart.java 的类中。

具体实现如下:

package gtmobject;

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 java.util.List;

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.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.Second;
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 生成图片的文件名
*/
private TimeSeriesCollection dataset = null;
public String getLineXYChart(HttpSession session, PrintWriter pw)
{
XYDataset dataset = this.dataset;//建立数据集
String fileName = null;
//建立JFreeChart
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"JFreeChart时间曲线序列图", // title
"日期", // x-axis label
"值", // y-axis label
dataset, // data
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
//设置JFreeChart的显示属性,对图形外部部分进行调整
chart.setBackgroundPaint(Color.gray);//设置曲线图背景色
//设置字体大小,形状
Font font = new Font("宋体", Font.BOLD, 16);
TextTitle title = new TextTitle("趋势分析图", 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);
}
//设置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);
//设置X轴(日期轴)
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
try
{
fileName = ServletUtilities.saveChartAsPNG(chart, 600, 350, info,
session);//生成图片
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, fileName, info, false);
}
catch (IOException e)
{
e.printStackTrace();
}
pw.flush();
return fileName;//返回生成图片的文件名
}
/**
* 建立生成图形所需的数据集
* @return 返回数据集
*/
public void createDateSet(List date,List vl)
{
dataset = new TimeSeriesCollection();//时间曲线数据集合
TimeSeries s1 = new TimeSeries("历史曲线", Second.class);//创建时间数据源,每一个//TimeSeries在图上是一条曲线
//s1.add(new Day(day,month,year),value),添加数据点信息
String strdate=null;
int mh;
int dy;
int hr;
int mt;
int sd;
int yr;
for(int i=0;i{
 if(dateJudge(String.valueOf(date.get(i))))//判断是否为日期
 {
  try{
  yr=Integer.parseInt(String.valueOf(date.get(i)).substring(0,4));//年
  strdate=String.valueOf(date.get(i)).substring(5);
  mh=Integer.parseInt(howGet(strdate,"-"));//月 判断日期的格式来截取数值,如‘2009-9-9 9:9:0’ 和‘2009-09-09 09:09:00‘
  strdate=substr(strdate,"-");
  dy=Integer.parseInt(howGet(strdate," "));//日
  strdate=substr(strdate," ");
  hr=Integer.parseInt(howGet(strdate,":"));//小时
  strdate=substr(strdate,":");
  mt=Integer.parseInt(howGet(strdate,":"));//分钟
  strdate=substr(strdate,":");
  sd=Integer.parseInt(strdate);//秒
  s1.add(new Second(sd,mt,hr,dy,mh,yr),Float.parseFloat(String.valueOf(vl.get(i))));
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 
}
this.dataset.addSeries(s1);
}

public boolean dateJudge(String strDate)//判断是否为日期
{
 boolean flag=false;
 if(strDate.indexOf("-")>0)
 {
  strDate=strDate.substring(strDate.indexOf("-")+1);
  if(strDate.indexOf("-")>0)
  {
   strDate=strDate.substring(strDate.indexOf("-")+1);
   if(strDate.indexOf(" ")>0)
   {
    strDate=strDate.substring(strDate.indexOf(" ")+1);
    if(strDate.indexOf(":")>0)
    {  
     strDate=strDate.substring(strDate.indexOf(":")+1);  
                    if(strDate.indexOf(":")>0)
                    {
                     flag=true;
         return flag;                    
                    }     
    }
   }
  }
 }
 return flag;
}
public String howGet(String need,String sign)
{  
 switch(need.indexOf(sign))
 {
 case 1:
  need=need.substring(0,1);
        break;
 case 2:
  need=need.substring(0,2);
  break;
 default:
  need=null;
     break;
 } 
 return need;
}
public String substr(String datestr,String sign)
{
 switch(datestr.indexOf(sign))
 {
 case 1:
  datestr=datestr.substring(2);
  break;
 case 2:
  datestr=datestr.substring(3);
  break;
 default:
  datestr=null;
     break;
 }  
 return datestr;
}
}
该类的createDateSet(List date,List vl) 实现的是从data中获取时间日期数据,从vl中获取值。

getLineXYChart(HttpSession session, PrintWriter pw) 实现对显示图形界面的设置。

5、最后一步就是实现对刚刚生成的曲线图形在web上显示出来,如何让生成的图形在web中显示出来了?这个实现的方法是先在服务器端根据刚刚createDateSet(List date,List vl)得到的数据和getLineXYChart(HttpSession session, PrintWriter pw)对图形的设置最后生成该图形,然后在客户端获得该生成图形的URL下载到客户端显示出来。具体实现代码如下:

<%@ page contentType="text/html;charset=GBK" %>

<%@ page import    = "LineXYChart类的URL" %>

LineXYChart xyChart=new LineXYChart();//创建LineXYChart 对象。

       xyChart.createDateSet(dt,vl);//添加数据集合
          String fileName=xyChart.getLineXYChart(session,new PrintWriter(out));//创建画布并设置
          String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;

//获取生成的图形的URL;
     %>
    

      


           
        

 

阅读(6806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~