使用JFreeChart制作图形报表

博客展示了使用Java代码绘制爱情走势图的过程。定义了CurveVo类存储数据,DrawPic类中的getData方法从数据库获取数据并封装成TimeSeriesCollection对象,draw方法根据该对象生成JFreeChart图表并保存为JPEG文件,最后进行了测试。
一、需求分析

  我家领导认为,在是否嫁给我做老婆的问题上,应该有更加科学的决策模型。如果能够将每天的感情生活量化,且以时间为X轴,生成数据报表,就可以为她的决策提供数据支持。秉着以领导意志为导向的基本原则,开发了本软件,为家庭信息化建设提供新的思路。

二、系统概述

  本系统的基本功能是,接收用户每天的输入并保存,月/季度/年度末生成数据折线图、周期环比柱状图。由于投入资金有限(不让我往外掏钱就已经很不错了),所以本软件的1.0版采用单机应用程序,使用Access数据库。如果市场推广情况良好,不排除推出大型FRP软件(FamilyResourceProject)的可能,届时将包含KRM(KinRelationManage,家族关系管理)、HA(HouseAutomatization,家庭自动化)等模块,利用强大的J2EE框架,为家庭信息化建设提供完整解决方案。

程序生成的目标图片效果如下:


三、系统要求

1、开源工具包jfreechart-1.0.0-pre1.jar和它自己要使用的工具包jcommon-1.0.0-pre1.jar

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

2、女朋友一个。

请自行准备,暂不提供下载

下面主要讲述系统是如何从数据库中提取数据,然后生成图形报表的。(终于进入正题了。)

数据表结构:

curve_id流水号自动增长

curve_ownervarchar(30)区分是老公的数据还是老婆的数据

curve_centdouble当天分数

curve_yearint年

curve_monthint月

curve_dayint日

notetext备注

用于封装每个分数的值对象如下:

  1. packageorg.bromon.fiona.curve.dao;
  2. importjava.util.*;
  3. publicclassCurveVo
  4. {
  5. privateintyear;
  6. privateintmonth;
  7. privateintday;
  8.   privatedoublecent;
  9.   privateStringnote;
  10.    privateStringowner;
  11.    //get/set方法
  12. …………
  13. }

生成图片的关键代码如下:

  1. packageorg.bromon.fiona.curve.util;
  2. //一大堆import
  3. publicclassDrawPic
  4. {
  5. /**
  6.     *根据时间查询数据,将所得到的数据封装成TimeSeriesCollection对象
  7.     *TimeSeriesCollection是JfreeChart中定义的类的对象
  8.     *本方法将被后面的draw方法调用
  9.     *@paramint要查询哪一年
  10.     *@paramint要查询哪一月
  11.     *@returnTimeSeriesCollection
  12.     */
  13. publicTimeSeriesCollectiongetData(intyear,intmonth)
  14. {
  15. //fiona的数据集合,其中存放的是上面定义过的CurveVo值对象
  16.        //这些值对象的值来自于数据库,相关代码是最常见的jdbc内容,请自行完成
  17. ListdataOfFiona=newArrayList();
  18. //Bromon的数据集合
  19.        ListdataOfBromon=newArrayList();
  20.        //构造要返回的对象
  21.        TimeSeriesCollectionresult=newTimeSeriesCollection();
  22.        //这两个对象,分别对应一条曲线,构造函数的参数,将显示在图片的下方
  23.        TimeSeriesfiona=newTimeSeries("fiona");
  24.        TimeSeriesbromon=newTimeSeries("bromon");
  25.        CurveVocv=null;
  26.        //遍历Fiona的数据集,填充fiona对象
  27.        for(inti=0;i<dataOfFiona.size();i++)
  28.        {
  29.          cv=(CurveVo)dataOfFiona.get(i);
  30.          fiona.add(newTimeSeriesDataItem(newDay(cv.getDay(),cv.getMonth(),cv.getYear()),newDouble(cv.getCent())));
  31.        }
  32.        result.addSeries(fiona);
  33.        for(inti=0;i<dataOfBromon.size();i++)
  34.        {
  35.          cv=(CurveVo)dataOfBromon.get(i);
  36.          bromon.add(newTimeSeriesDataItem(newDay(cv.getDay(),cv.getMonth(),cv.getYear()),newDouble(cv.getCent())));
  37.         }
  38.         result.addSeries(bromon);
  39. }
  40. //生成图表的方法,图表数据来自上面的getData方法
  41. publicStringdraw(inty,intm)
  42.  {
  43. Stringresult=null;
  44. Stringtitle="Bromon&Fiona的爱情走势图";
  45. StringsubTitle=y+"年"+m+"月";
  46. Stringdomain="时间";//x轴
  47. Stringrange="分值";//y轴
  48. TimeSeriesCollectiondata=this.getData(y,m);
  49. JFreeChartchart=ChartFactory.createTimeSeriesChart(title,domain,range,data,true,true,false);
  50. TextTitlesubtitle=newTextTitle(subTitle,newFont("宋体",Font.BOLD,20));
  51. chart.addSubtitle(subtitle);
  52. chart.setTitle(newTextTitle(title,newFont("宋体",Font.ITALIC,20)));
  53. chart.setBackgroundPaint(newGradientPaint(0,0,Color.white,0,1000,Color.white));
  54. c.setTime(newDate());
  55. StringfileName="c:\\pics\\"+y+""+m+".jpg";//保存为位置
  56. try
  57. {
  58. Filef=newFile("c:\\pics");
  59. if(!f.exists())
  60. {
  61. f.mkdir();
  62. }
  63. ChartUtilities.saveChartAsJPEG(newFile(fileName),100,chart,1000,600);//宽1000,高600
  64. }catch(Exceptione)
  65. {
  66. e.printStackTrace();
  67. }
  68. result=fileName;
  69. returnresult;
  70. }
  71. //ok,测试一下
  72.   publicstaticvoidmain(Stringargs[])
  73.   {
  74.     newDrawPic().draw(2005,3);
  75.   }
  76. }

  生成环比柱状图的相关内容,整理后放出。

  JfreeChart的绘图功能很强大,但是API的编写有些地方让人很不舒服,很多元素要定制不容易。如果有更好的API的话,我很愿意使用,当然,免费是个很重要的前提。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值