图书管理系统总结——统计图实现

JAVA的JFreeChar提供了绘制各种与统计有关的图形,比如直方图,折线图,饼图等,而且有各种样式。这里只是应用了最简单的绘制,没有什么炫酷的修饰。

一、饼状图:

实现饼状图的类为

public class PieChart {
    ChartPanel frame1;

    public PieChart() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * 画出指定大小饼状图
     * @param v 表示图片大小
     * @param TypeBuffer 用来记录图书种类
     * @param number 用来记录每种图书对应的数量
     */
    public PieChart(Dimension v,StringBuffer[] TypeBuffer,int[] number)
    {
          DefaultPieDataset data = getDataSet(TypeBuffer,number);//数据集获得
          JFreeChart chart = ChartFactory.createPieChart3D(
                                       "借阅分类分布",//// 图表标题
                                        data,//数据集
                                         true,// 是否显示图例
                                         false,// 是否生成工具
                                          false// 是否生成URL链接
                                          );// 创建图表
        //设置百分比
          PiePlot pieplot = (PiePlot) chart.getPlot();
          DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题
          NumberFormat nf = NumberFormat.getNumberInstance();//获得一个NumberFormat对象
          StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0}  {2}", nf, df);//获得StandardPieSectionLabelGenerator对象
          pieplot.setLabelGenerator(sp1);//设置饼图显示百分比

      //没有数据的时候显示的内容
          pieplot.setNoDataMessage("无数据显示");
          pieplot.setCircular(false);
          pieplot.setLabelGap(0.02D);

          pieplot.setIgnoreNullValues(true);//设置不显示空值
          pieplot.setIgnoreZeroValues(true);//设置不显示负值
          frame1=new ChartPanel (chart,true);
          frame1.setPreferredSize(new Dimension(v));//设置大小
          chart.getTitle().setFont(new Font("宋体",Font.BOLD,35));//设置标题字体
          PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象
          piePlot.setLabelFont(new Font("宋体",Font.BOLD,30));//解决乱码,设置标签的字体
          chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,35));//设置下面图例字体
    }

    /**
     *生成与外界窗口一样大小图
     * @param TypeBuffer
     * @param number
     */
    public PieChart(StringBuffer[] TypeBuffer,int[] number)
    {
          DefaultPieDataset data = getDataSet(TypeBuffer,number);
          JFreeChart chart = ChartFactory.createPieChart3D("借阅分类分布",data,true,false,false);
        //设置百分比
          PiePlot pieplot = (PiePlot) chart.getPlot();
          DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题
          NumberFormat nf = NumberFormat.getNumberInstance();//获得一个NumberFormat对象
          StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0}  {2}", nf, df);//获得StandardPieSectionLabelGenerator对象
          pieplot.setLabelGenerator(sp1);//设置饼图显示百分比

      //没有数据的时候显示的内容
          pieplot.setNoDataMessage("无数据显示");
          pieplot.setCircular(false);
          pieplot.setLabelGap(0.02D);

          pieplot.setIgnoreNullValues(true);//设置不显示空值
          pieplot.setIgnoreZeroValues(true);//设置不显示负值
          frame1=new ChartPanel (chart,true);
          chart.getTitle().setFont(new Font("宋体",Font.BOLD,35));//设置标题字体
          PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象
          piePlot.setLabelFont(new Font("宋体",Font.BOLD,30));//解决乱码
          chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,35));
    }
    /**
     * 获得数据集
     * @param TypeBuffer
     * @param number
     * @return
     */
    private static DefaultPieDataset getDataSet(StringBuffer[] TypeBuffer,int[] number)
    {
        DefaultPieDataset dataset = new DefaultPieDataset();
        for(int i=0;i<TypeBuffer.length;++i)
        {
            if(StringUtil.isEmpty(TypeBuffer[i].toString()))//每个下标对应图书类别的主键,如果那个主键下没有记录,跳过
            {
                continue;
            }
            else
            {
                dataset.setValue(TypeBuffer[i].toString(),number[i]);//数据集来自图书种类名称和相应种类的借阅本数
            }
        }
        return dataset;
  }
    public ChartPanel getChartPanel(){
        return frame1;
    }
}

其中TypeBuffer和number获得方式就是扫描借阅记录的表格,将每条记录图书类别的主键作为这两个数组的下标,++即可:

/**
 * 借阅分布统计
 */
private void HisBorrowPieChart(StringBuffer[] TypeBuffer,int[] number)
{
    Connection con=null;
    try {
        con=dbUtil.getCon();
        Arrays.fill(number,0);//初始将所有类别本数置0
        for(int i=0;i<TypeBuffer.length;++i)
        {
             TypeBuffer[i]=new StringBuffer();//切记StringBuffer需要分配空间!这是与String最大不同
        }
        if(StringUtil.isEmpty(PresentUser))
        {
            Dialogutil attention=new Dialogutil(null,"Attention!","用户信息获取失败!");
            return;
        }
        else
        {
            //找到当前书和用户
            User user=new User(PresentUser);
            ResultSet Hisbo=borrowDao.HisBorrowDistri(con,user);//获取所有记录,由用户ID查找
            while( Hisbo.next()){
                int index=Hisbo.getInt("bt.id");//主键作为数组下标
                if(StringUtil.isEmpty(TypeBuffer[index].toString()))
                {                    TypeBuffer[index].append(Hisbo.getString("bt.bookTypeName"));
                }
                number[index]++;
            }
        }
    } catch (Exception e) {
        Dialogutil attention=new Dialogutil(null,"Attention!","用户信息获取失败!");
        e.printStackTrace();
    }
}

调用方式为:

HisBorrowPieChart(TypeBuffer,TypeNum);//更新数据集
PieChartJP.add(new PieChart(PieDi,TypeBuffer,TypeNum).getChartPanel());//添加饼状图 ,画在一个Jpanel容器中

二、折线图

public class TimeSeriesChart
{
    ChartPanel frame1;
/**
     * 折线图构造函数
     * @param v 折线图大小
     * @param BookMonthly 记录每个月本数,下标与月对应
     * @param CurrentYear  记录当前年份
     */
    public TimeSeriesChart(Dimension v,int []BookMonthly,int CurrentYear)
{
        XYDataset xydataset = createDataset(BookMonthly,CurrentYear);
        JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("借阅趋势",//标题
                                                 "月份", //横坐标
                                                 "数量",//纵坐标
                                                  xydataset,//数据集
                                                   true,//有图例
                                                  true,//有工具集
                                                    true//统一资源定位图
                                                     );
        XYPlot xyplot = (XYPlot) jfreechart.getPlot();  // 获取绘图区对象
        DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();
        DecimalFormat df = new DecimalFormat("#0");//整数
        //y轴用整数表示
        ((NumberAxis) ((XYPlot)jfreechart.getPlot()).getRangeAxis()).setNumberFormatOverride(df);

        dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM"));//横轴格式-yyyy

        frame1=new ChartPanel(jfreechart,true);
        frame1.setPreferredSize(new Dimension(v));//设置大小

        dateaxis.setLabelFont(new Font("黑体",Font.BOLD,30));         //水平底部标题
        dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,30));  //垂直标题
       // axis0.setLabelFont(new Font("黑体", Font.PLAIN, 12));// y轴字体
        ValueAxis rangeAxis=xyplot.getRangeAxis();//获取柱状
        rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,35));
        jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 30));
        //设定y在轴显示范围
       // NumberAxis domainAxis = (NumberAxis)xyplot.getDomainAxis();
        //纵轴从0开始
        //((NumberAxis)rangeAxis).setAutoRangeIncludesZero(true);
        rangeAxis.setLowerBound(0);
        //找最大值
         int max = BookMonthly[0];//定义变量
            for (int x=1; x<BookMonthly.length; x++ )
            {
                if (BookMonthly[x]>max)
                {
                    max = BookMonthly[x];
                }
            }
        rangeAxis.setUpperBound(max+1);//显示最大设为记录中最大值+1
     // 设置y轴不是使用自动刻度
        ((NumberAxis)rangeAxis).setAutoTickUnitSelection(false);
        // 设置刻度
        NumberTickUnit numberTickUnit = new NumberTickUnit(1);
        ((NumberAxis)rangeAxis).setTickUnit(numberTickUnit);
        jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,35));//设置标题字体

    }
     private static XYDataset createDataset(int []BookMonthly,int CurrentYear)
     {  //这个数据集有点多,但都不难理解
            TimeSeries timeseries = new TimeSeries(Integer.toString(CurrentYear)+"各月借阅数量",
                    org.jfree.data.time.Month.class);//时间轴精确到月
            timeseries.add(new Month(1,CurrentYear), BookMonthly[1]);//设置每个月数量
            timeseries.add(new Month(2,CurrentYear), BookMonthly[2]);
            timeseries.add(new Month(3,CurrentYear), BookMonthly[3]);
            timeseries.add(new Month(4,CurrentYear), BookMonthly[4]);
            timeseries.add(new Month(5,CurrentYear), BookMonthly[5]);
            timeseries.add(new Month(6,CurrentYear), BookMonthly[6]);
            timeseries.add(new Month(7,CurrentYear), BookMonthly[7]);
            timeseries.add(new Month(8,CurrentYear), BookMonthly[8]);
            timeseries.add(new Month(9,CurrentYear), BookMonthly[9]);
            timeseries.add(new Month(10,CurrentYear), BookMonthly[10]);
            timeseries.add(new Month(11,CurrentYear), BookMonthly[11]);
            timeseries.add(new Month(12,CurrentYear), BookMonthly[12]);
            TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
            timeseriescollection.addSeries(timeseries);
            return timeseriescollection;
        }
      public ChartPanel getChartPanel()
      {
            return frame1;
        }
}

数组BookMonthly对应值获得同样先连接数据库,扫描借阅表,取出其中的借阅日期,以月作为数组下标++即可:

//找到当前书和用户
            User user=new User(PresentUser);
            //获取当前时间
            java.sql.Date currentDate = new java.sql.Date(System.currentTimeMillis());
            DateInt curdate=new DateInt();
            DateUtil.getdate(currentDate, curdate);
            this.CurrentYear=curdate.getYear();
            ResultSet Hisbo=borrowDao.HisBorrowTrend(con,user);//获取所有记录,由用户ID查找
            while( Hisbo.next())
            {
                DateInt date=new DateInt();
                DateUtil.getdate(Hisbo.getDate("borTime"), date);
                if(curdate.getYear()==date.getYear())
                {
                    BookMonthly[date.getMonth()]++;//只统计当前年份
                }
                else
                {
                    continue;
                }
            }

使用折线图方式:

HisBorrowBrokenLine(BookMonthly);//更新数据集
BrokenLineJP.add(new TimeSeriesChart(Linetrend,BookMonthly,CurrentYear).getChartPanel()); //添加折线图  

三、柱状图:

柱状图构造类实现方式:

public class BarChart {
      ChartPanel frame1; 

      public BarChart() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * 柱状图构造函数
     * @param TypeBuffer 图书种类名称
     * @param number   图书种类对应数目
     */
    public  BarChart(StringBuffer[] TypeBuffer,int[] number)
      {
      CategoryDataset dataset = getDataSet(TypeBuffer,number);
      JFreeChart chart = ChartFactory.createBarChart3D( "各类图书借阅统计", // 图表标题
                                "图书种类", // 目录轴的显示标签
                                "数量", // 数值轴的显示标签
                                dataset, // 数据集
                                PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                                true,           // 是否显示图例(对于简单的柱状图必须是false)
                                false,          // 是否生成工具
                                false           // 是否生成URL链接
                                );  

         CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
         CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表
         domainAxis.setLabelFont(new Font("黑体",Font.BOLD,30));         //水平底部标题
         domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,30));  //垂直标题  

         ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
         //设置刻度
         NumberTickUnit numberTickUnit = new NumberTickUnit(1);
         ((NumberAxis)rangeAxis).setTickUnit(numberTickUnit);
         //设置柱状图顶部数字
         BarRenderer3D renderer = (BarRenderer3D) plot.getRenderer(); //获得当前数据
         renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); //显示每个柱的数值  

         renderer.setBaseItemLabelsVisible(true);
         renderer.setBaseItemLabelPaint(Color.BLACK);
         renderer.setBaseItemLabelFont(new Font("宋书",Font.PLAIN,30));
       //注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
         renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition
                 (ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_CENTER ));//表示显示在上方,中间
         //ItemLabelAnchor.OUTSIDE3(显示在垂直方向中间), TextAnchor.BASELINE_RIGHT(显示在柱子右边)
         renderer.setItemLabelAnchorOffset(10D);// 设置柱形图上的文字偏离值
         rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
         chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 30));
         chart.getTitle().setFont(new Font("宋体",Font.BOLD,30));//设置标题字体
         //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题
          frame1=new ChartPanel(chart,true);        //这里也可以用chartFrame,可以直接生成一个独立的Frame
        } 

        /**
         * 获取数据
         * @return
         */
       private static CategoryDataset getDataSet(StringBuffer[] TypeBuffer,int[] number)
       {
           DefaultCategoryDataset dataset = new DefaultCategoryDataset();
           for(int i=0;i<TypeBuffer.length;++i)
            {
               if(StringUtil.isEmpty(TypeBuffer[i].toString()))
                {
                    continue;
                }
               else
               {
                   dataset.addValue(number[i],TypeBuffer[i].toString(),TypeBuffer[i].toString());
               }
            }

           return dataset;
}
    public ChartPanel getChartPanel()
    {
        return frame1;  

    }
}

数据集和饼状图一样。但这里显示时候是管理员图书统计按钮下单独开的一个JFrame窗口,与饼状图一起上下排列显示:

public class Statistic extends JFrame {

    private JPanel contentPane;
     //设置跟随分辨率变化窗口
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    private int screenHeight = (int) screenSize.getHeight();
    private int screenWidth = (int) screenSize.getWidth();
    private double enlargement_x=screenWidth/1920;
    private double enlargement_y=screenHeight/1080;
    private int windowWidth ; //获得窗口宽
    private int windowHeight; //获得窗口高
    /*******************统计变量***************************************/
    final private int typenum=50;//用于存放有多少图书种类
       int []TypeNum=new int[typenum];
    StringBuffer[] TypeBuffer=new StringBuffer[typenum];//记录各类书数量
    int []BookMonthly=new int[13];//统计各月借阅数量,下标与月份对齐
    int CurrentYear;//当前年份,用于折线图数据
    /**************************数据库操作****************************************/
    DbUtil dbUtil=new DbUtil();//数据库连接类
    BorrowDao borrowDao=new BorrowDao();//借阅表类
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Statistic frame = new Statistic();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Statistic()
    {
        setResizable(false);
        setTitle("\u6570\u636E\u7EDF\u8BA1\u56FE");
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setBounds(screenWidth * 2/7, screenHeight / 3, (int)(1400*enlargement_x),(int)(1600*enlargement_y));
        windowWidth = this.getWidth(); //获得窗口宽
        windowHeight = this.getHeight(); //获得窗口高
        this.setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);//设置窗口居中显示
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(2,1,10,10));
         //Dimension PieDi=new Dimension(50,80);
        HisBorrowPieChart(TypeBuffer,TypeNum);//获得数据
        contentPane.add(new PieChart(TypeBuffer,TypeNum).getChartPanel());           //添加饼状图
        contentPane.add(new BarChart(TypeBuffer,TypeNum).getChartPanel());//添加柱形图
        //设置JFrame最大化
        //this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }

}
时间: 2024-10-17 05:34:32

图书管理系统总结——统计图实现的相关文章

脚踏实地 志存高远-快意图书管理系统开发侧记之二

以网络技术为主的信息技术的飞速发展,使得图书管理信息化向着更加智能.快捷的方向不断变革.原有的一批图书管理软件的处理模式.软件架构.操作流程已不能满足网络时代所要求的双向互动.信息共享.高度智能的操作诉求.快意团队于2011年10月成立,并在调研数家企事业单位.大中专学校.中小学校图书管理业务流程及需求的基础上,研制了快意图书管理综合解决方案,开发了快意图书综合管理软件,并针对不同行业特点,进行了差异化开发,推出了快意图书管理企事业版本,中小学版本.大中专院校等多个版本,为不同行业图书管理提供了

图书管理系统

该图书馆里系统能实现基本的对图书信息的操作和借阅.归还功能. 一.主要内容: 本课程设计结合本学期所学C语言知识,数组.函数.结构体.指针.链表.文件读取操作等等,准备设计开发一个简单的图书管理系统.设计开发这个系统需要用到链表.文件读取操作.结构体.函数.指针.等C语言知识.本课程设计将会实现对图书信息的账号登录.注册账号.密码修改.密码查找.查找.输出.排序.备份.恢复.图书借阅和归还功能.本着简单.易用的设计原则,本课程设计在尽量优化界面在保证输入输出美观的同时又不失友好的交互界面. 本次

图书管理系统------软件设计图纸

图书管理系统------软件设计图纸 一.图书馆管理系统总体功能概述 图书馆管理系统功能图: 1.系统登录模块 : 本模块的功能点包括: (1) 判断用户名和密码是否相符: (2) 根据用户的权限类型,登录到系统的制定界面操作使用. 2.图书管理模块: 在本模块中图书馆工作人员可以对图书进行管理操作. 本模块的功能点包括: (1) 新书入库,将新进图书按其类型将图书的基本信息录入系统数据库: (2) 图书出库,某一部分图书会随着时间的增长及知识的更新而变得不再有收藏的价值,或者图书被损坏,这些图

图书管理系统测试计划说明书

图书管理系统测试计划说明书 一. 引言 1.1 编写目的 本测试计划文档作为指导此测试项目循序渐进的基础,帮助我们安排合适的资源和进度,避免可能的风险.本文档有助于实现以下目标: 1) 确定现有项目的信息和应测试的软件结构. 2) 列出推荐的测试需求 3) 推荐可采用的测试策略,并对这些策略加以详细说明 4) 确定所需的资源,并对测试的工作量进行估计. 5) 列出测试项目的可交付元素,包括用例以及测试报告等. 1.2 背景 随着人们知识层次的提高,阅读成为日常生活中不可缺少的一部分.而图书馆的存

s1考试 图书管理系统 结构体版

讲解目录 <保卫战:异形入侵>游戏开发    1 第一讲   游戏演示和资源的介绍    1 第二讲  "异形"怪物的实现    1 第三讲  "异形"怪物生命值的体现    9 第四讲  "异形"怪物死后处理    12 第五讲  玩家的制作    15 第六讲  玩家的行走控制(键盘)    16 第七讲  武器的切换(鼠标)     16 第八讲  摄像头的变化(鼠标)    19 第九讲  子弹预制体和特效的制作    20

Java图书管理系统(用Java常用集合实现)

图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭住址,手机号码,登录名称,登录密码,状态. 5.图书属性包括:id,图书名称,作者,单价,出版社,出版日期,类别. 6.技术:通过用集合来模拟数据库实现该系统,建议采用List集合实现,集合模拟数据库只是一个数据的临时保存. 二.功能说明 1.注册功能 描述:注册需要用户输入所有的必须的用户信息.

图书管理系统类图

一. 实验目的  使用面向对象的建模方法创建图书管理系统的类图. 二. 实验要求 画出该系统的类图 . 三. 实验器材 计算机一台. Office Visio 2010或Rational Rose工具软件. 四.  实验内容 创建类图,以及他们之间的关系 users:用户 record:记录 books:图书信息

C语言课程设计—图书管理系统

这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<stdio.h> #include<stdlib.h> #include<string.h> struct book{ char book_name[30]; int bianhao; double price; char author[20]; char state[20]; cha

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website development Tags asp.net / mvc4 相关资源 ibatis manual pro git 廖雪峰的官方网站 BookMS-V1.0 上一篇链接 任务简介 开发工具:VS2010 项目框架:MVC4 浏览器:Chrome 数据库ORM框架:iBatis.net 数据库:mysql 后端开