JFreeChart 心得

今天用JFreeChart做曲线图来表示一个矿物局在一个月内的销售量.在开发的过程中遇到了不少问题.

首先我要说的是

求出当前年月..哪年哪月...

然后求出 这个月有多少天.(并不是所有月的天数是固定的,所以要根据实际情况求出月份天数)

         // 年份
        SimpleDateFormat nf  =   new  SimpleDateFormat( " yyyy " );
        java.util.Date nownf 
=   new  java.util.Date() ;
        String currentyear 
=  nf.format(nownf);
        System.
out .println(currentyear);
        
int  year = Integer.parseInt(currentyear);     // 为了Calendar  才转化成int类型
        
// 月份
        SimpleDateFormat df  =   new  SimpleDateFormat( " MM " );
        java.util.Date now 
=   new  java.util.Date() ;
        String currentmonth 
=  df.format(now);
        System.
out .println(currentmonth);
        
int  month = Integer.parseInt(currentmonth);  // 为了Calendar  才转化成int类型
        
// 一个月有多少天数
        Calendar  cal   =    Calendar.getInstance();   
        cal.
set (Calendar.YEAR,year);   
        cal.
set (Calendar.MONTH,month - 1 ); // Calendar.MONTH - 用来设置 MONTH 日历字段的值。Month 值是基于 0 的。例如,0 表示 1月份。  
         int   maxDate =  cal.getActualMaximum(Calendar.DATE); // 返回指定日历字段可能拥有的最大值
        System. out .println( " maxDate= " + maxDate);
        
int   minDate =  cal.getActualMinimum(Calendar.DATE); // 返回指定日历字段可能拥有的最小值
        System. out .println( " minDate= " + minDate);

然出开始做"曲线图"

// 曲线的样式类型,月:MONTH  , 天:DAY ,小时:HOUR,分钟:Minute
//
TimeSeries series1  =   new  TimeSeries( " 实时状态图 " , Month. class ); 
//TimeSeries series2 
=   new  TimeSeries( " 实时状态图 " , Day. class ); 
//TimeSeries series3 
=   new  TimeSeries( " 实时状态图 " , Hour. class ); 
//TimeSeries series4 
=   new  TimeSeries( " 实时状态图 " , Minute. class ); 

 

org.jfree.data.time 
Class Month


Month() 
          Constructs a 
new  Month, based on the current system time. 
Month(java.util.Date time) 
          Constructs a 
new  month instance, based on a date / time and the  default  time zone. 
Month(java.util.Date time, java.util.TimeZone zone) 
          Constructs a Month, based on a date
/ time and a time zone. 
Month(
int  month,  int  year) 
          Constructs a 
new  month instance. 
Month(
int  month, Year year) 
          Constructs a 
new  month instance. 


org.jfree.data.time 
Class Day


Day() 
          Creates a 
new  instance, derived from the system date / time (and assuming the  default  timezone). 
Day(java.util.Date time) 
          Constructs a 
new  instance, based on a particular date / time and the  default  time zone. 
Day(java.util.Date time, java.util.TimeZone zone) 
          Constructs a 
new  instance, based on a particular date / time and time zone. 
Day(
int  day,  int  month,  int  year) 
          Constructs a 
new  one day time period. 
Day(org.jfree.date.SerialDate serialDate) 
          Constructs a 
new  one day time period. 

org.jfree.data.time 
Class Minute

Minute() 
          Constructs a 
new  Minute, based on the system date / time. 
Minute(java.util.Date time) 
          Constructs a 
new  Minute, based on the supplied date / time. 
Minute(java.util.Date time, java.util.TimeZone zone) 
          Constructs a 
new  Minute, based on the supplied date / time and timezone. 
Minute(
int  minute, Hour hour) 
          Constructs a 
new  Minute. 
Minute(
int  minute,  int  hour,  int  day,  int  month,  int  year) 
          Creates a 
new  minute. 


org.jfree.data.time 
Class Hour

Hour() 
          Constructs a 
new  Hour, based on the system date / time. 
Hour(java.util.Date time) 
          Constructs a 
new  Hour, based on the supplied date / time. 
Hour(java.util.Date time, java.util.TimeZone zone) 
          Constructs a 
new  Hour, based on the supplied date / time evaluated in the specified time zone. 
Hour(
int  hour, Day day) 
          Constructs a 
new  Hour. 
Hour(
int  hour,  int  day,  int  month,  int  year) 
          Creates a 
new  hour. 

例如:我自己的程序。

// 当前月份  当前年份(哈哈,month,year要int类型的,所以我在前面就类型转换了)
//
Month month1 = new  Month( int  month, int  year); 
//Day day 
=   new  Day( 1 11 2007 );  //  定义日期
//
Minute current  =   new  Minute( 2 14 14 11 2007 );  //  图形使用的时间
// 以上三个构造函数所要的参数都是int类型的哦

 

   具体的代码如下:

ChartServlet1.java

package  com.test.chart;

import  java.io.IOException;
import  java.io.OutputStream;
import  java.text.DateFormat;
import  java.text.SimpleDateFormat;
import  java.util.Calendar;
import  java.util.Date;

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

import  org.jfree.chart.ChartFactory;
import  org.jfree.chart.ChartUtilities;
import  org.jfree.chart.JFreeChart;
import  org.jfree.chart.axis.DateAxis;
import  org.jfree.chart.axis.DateTickUnit;
import  org.jfree.chart.axis.ValueAxis;
import  org.jfree.chart.plot.XYPlot;
import  org.jfree.data.Range;
import  org.jfree.data.time.Day;
import  org.jfree.data.time.TimeSeries;
import  org.jfree.data.time.TimeSeriesCollection;

public   class  ChartServlet1  extends  HttpServlet  {
    
private static final String CONTENT_TYPE = "text/html; charset=GBK";

    
// Initialize global variables
    public void init() throws ServletException {
    }


    
// service
    public void service(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        OutputStream out 
= response.getOutputStream(); // 定义输出流
        try {
            JFreeChart chart 
= null// 创建图标工具
            chart = createTimeSeriesChart(); // 产生折线图
            if (chart != null{
                response.setContentType(
"image/png"); // 定义类型
                ChartUtilities.writeChartAsPNG(out, chart, 600300); // 输出
            }

        }
 catch (Exception e) {
            System.err.println(e.toString());
        }
 finally {
            out.close(); 
// 关闭流
        }


    }


    
private JFreeChart createTimeSeriesChart() {
        
//年份
        SimpleDateFormat nf = new SimpleDateFormat("yyyy");
        java.util.Date nownf 
= new java.util.Date() ;
        String currentyear 
= nf.format(nownf);
        System.out.println(currentyear);
        
int year=Integer.parseInt(currentyear);
        
//月份
        SimpleDateFormat df = new SimpleDateFormat("MM");
        java.util.Date now 
= new java.util.Date() ;
        String currentmonth 
= df.format(now);
        System.out.println(currentmonth);
        
int month=Integer.parseInt(currentmonth);
        
//一个月有多少天数
        Calendar  cal  =   Calendar.getInstance();   
        cal.set(Calendar.YEAR,year);   
        cal.set(Calendar.MONTH,month
-1);//Calendar.MONTH - 用来设置 MONTH 日历字段的值。Month 值是基于 0 的。例如,0 表示 1月份。  
        int  maxDate= cal.getActualMaximum(Calendar.DATE);//返回指定日历字段可能拥有的最大值   
        System.out.println("maxDate="+maxDate);
        
int  minDate= cal.getActualMinimum(Calendar.DATE);//返回指定日历字段可能拥有的最小值
        System.out.println("minDate="+minDate);
        
        
//TimeSeries series2 = new TimeSeries("实时状态图",Month.class); // 第一条折线
        TimeSeries series = new TimeSeries("实时状态图",Day.class); // 第一条折线
        Day day;
        
// 添加测试数据 maxDate 就是当前月份最大的天数
        
//最大值就是表示当前月有多少天
        for (int i = 1; i <=maxDate; i++{
            
//day=new Day(1,11,2007);//2007年11月1日开始
            day = new Day(i,month, year); // 定义日期
            series.add(day, Math.random() * 100); // 添加数据
            System.out.println("day="+day);
        }


        TimeSeriesCollection timeseriescollection 
= new TimeSeriesCollection(); // 定义折线集合

        timeseriescollection.addSeries(series); 
// 添加第一条曲线
        
//timeseriescollection.addSeries(series2); // 添加第二条曲线

        JFreeChart chart 
= ChartFactory.createTimeSeriesChart("xxx矿物局煤炭销售总量",
                
"""销售量", timeseriescollection, truetruefalse);
        
        
// Date valueOf(String s)将 JDBC 日期转义形式的字符串转换成 Date 值。 
        
        
// public Date(int year, int month, int date, int hrs, int min) {
        
// year - 减 1900 的年份。
        
// month - 0-11 之间的月份。
        
// date - 一月中 1-31 之间的某一天。
        
// hrs - 0-23 之间的小时数。
        
// min - 0-59 之间的分钟数。
        int years=year-1900;
        
int months=month-1;
        Date min 
= new Date(years, months, minDate);
        Date max 
= new Date(years, months, maxDate);
        
        XYPlot xyplot 
= chart.getXYPlot();
        DateAxis dateAxis 
= (DateAxis) xyplot.getDomainAxis();
        
// 横坐标设置
        
//dateAxis.setMaximumDate(max);     // 日期轴上的最大日期
        
//dateAxis.setMinimumDate(min);      // 日期轴上的最小日期
        dateAxis.setRange(min,max);         // 日期轴上的最小日期,最大日期
        
//dateAxis.setTickLabelsVisible(true);    //坐标轴标尺值是否显示
        dateAxis.setTickUnit(new DateTickUnit(2,1));  //设置坐标轴标尺值显示间隔 public void setTickUnit(DateTickUnit unit)
        dateAxis.setDateFormatOverride(new SimpleDateFormat("dd")); //日期轴日期标签的显示格式 只显示 日(号)

        
// 纵坐标设定
        ValueAxis valueaxis = null;
        valueaxis 
= xyplot.getRangeAxis();
        
        valueaxis.setRange(
0.0D, 200D); // 高度范围为 0 - 200   sp:销售量
        return chart;
    }

    
// Clean up resources
    public void destroy() {
    }

}

显示的页面:

 

<% @page contentType = " text/html;charset=GB2312 "  language = " java "   %>
< html >
    
< head >
    
</ head >
    
< script type = " text/javascript " >
    
var  req;
    
// setInterval( "castVote()" , 3000 ) //每隔3秒调用一次
     function  castVote(rank)  {
        
// This demo uses simple Html/JS only, so we load a static html page
        var url = "ii.jsp";    //ii.jsp随便写什么东西  "hello"
        
var callback = processAjaxResponse;
        executeXhr(callback, url);
    }


    
function  executeXhr(callback, url)  {
    
// branch for native XMLHttpRequest object
        if (window.XMLHttpRequest) {
            req 
= new XMLHttpRequest();
            req.onreadystatechange 
= callback;
            req.open(
"GET", url, true);
            req.send(
null);
        }
 // branch for IE/Windows ActiveX version
        else if (window.ActiveXObject) {
            req 
= new ActiveXObject("Microsoft.XMLHTTP");
           
if (req) {
                req.onreadystatechange 
= callback;
                req.open(
"GET", url, true);
                req.send();
            }

        }

}


    
function  processAjaxResponse()  {
        
// only if req shows "loaded"
        if (req.readyState == 4{
            
// only if "OK"
            if (req.status == 200{
                document.getElementById(
'votes').innerHTML = req.responseText;
            }
 else {
                alert(
"There was a problem retrieving the XML data: " +
                   req.statusText);
            }

        }

    }

    
</ script >
    
< body >
      
< div id = " votes " >< IMG src = ' myjfreecharttest '  BORDER = 1  WIDTH = 600  HEIGHT = 300 /></ div >
    
</ body >
</ html >

web.xml 配置

    < servlet >
      
< servlet-name > myjfreechart </ servlet-name >
      
< servlet-class > com.test.chart.ChartServlet1 </ servlet-class >
  
</ servlet >
  
< servlet-mapping >
      
< servlet-name > myjfreechart </ servlet-name >
      
< url-pattern > /myjfreecharttest </ url-pattern >
  
</ servlet-mapping >
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值