廉頗老矣,尚能飯否

          java:從技術(shù)到管理

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          生成兩個(gè)日期間的以天為間隔的折線圖(web方式和控制臺(tái)方式)

          package demo;

          import java.awt.Color;
          import java.awt.Font;
          import java.io.File;
          import java.io.FileOutputStream;
          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.ArrayList;
          import java.util.Calendar;
          import java.util.Date;
          import java.util.GregorianCalendar;
          import java.util.List;

          import org.jfree.chart.ChartFactory;
          import org.jfree.chart.ChartUtilities;
          import org.jfree.chart.JFreeChart;
          import org.jfree.chart.axis.CategoryAxis;
          import org.jfree.chart.axis.CategoryLabelPositions;
          import org.jfree.chart.axis.NumberAxis;
          import org.jfree.chart.plot.CategoryPlot;
          import org.jfree.chart.plot.PlotOrientation;
          import org.jfree.chart.renderer.category.LineAndShapeRenderer;
          import org.jfree.chart.title.TextTitle;
          import org.jfree.data.category.CategoryDataset;
          import org.jfree.data.general.DatasetUtilities;

          /**
           * 生成兩個(gè)日期間的以天為間隔的折線圖
           * @throws ParseException
           */
          public class MyLineAndShapeChart {
           public CategoryPlot getLineAndShapeChart() throws ParseException {  
          //準(zhǔn)備生成數(shù)據(jù)源需要的要素
            List<String> dateList = new ArrayList<String>();
            List<Double> valList = new ArrayList<Double>();
            
            String start = "2008-01-21";
            String end = "2008-02-08";
            //字符串轉(zhuǎn)換成日期
            SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
            Date startDate=format.parse(start);
            Calendar startTime=Calendar.getInstance();
            startTime.clear();
            startTime.setTime(startDate);
            int startYear = startTime.get(Calendar.YEAR);
            int startMonth = startTime.get(Calendar.MONTH);
            int startDay = startTime.get(Calendar.DAY_OF_MONTH);
            Date endDate=format.parse(end);
            Calendar endTime=Calendar.getInstance();
            endTime.clear();
            endTime.setTime(endDate);
            int endYear = endTime.get(Calendar.YEAR);
            int endMonth = endTime.get(Calendar.MONTH);
            int endDay = endTime.get(Calendar.DAY_OF_MONTH);
            System.out.println("注意西方的月份從0到11,中國(guó)的月份從1到12");
            System.out.println("下面輸入的是中國(guó)的日期.注意其中的轉(zhuǎn)換問題");
            System.out.println("start date : " + start);
            System.out.println("end date : " + end);
            
            int count = 0;
            for (int x = startYear; x <= endYear; x++) {
             //羅馬歷法產(chǎn)生年份公元1582年
             int gregorianCutoverYear = 1582;
             boolean isLeapYear = x >= gregorianCutoverYear ?
               ((x%4 == 0) && ((x%100 != 0) || (x%400 == 0))) :
                (x%4 == 0);
             //判斷是否是閏年
             //java方法
             //boolean isLeapYear = (new GregorianCalendar()).isLeapYear(x);
             
             String isBigYear = "是平年";
             if (isLeapYear) {
              isBigYear = "是閏年";
             }
             System.out.println(x + "年" + isBigYear);
             
             //獲取開始月的最大天數(shù)
             //java方法
             //SimpleDateFormat aFormat=new SimpleDateFormat("yyyy-MM-dd");
             //Date date = aFormat.parse(start);
             //Calendar time = Calendar.getInstance();
             //time.clear();
             //time.setTime(date);
             //int max=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數(shù)
             //System.out.println(max);
             
             //獲取開始月的最大天數(shù);大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
             int max = 0;
             if (startMonth == 1) {
              if (isLeapYear) {
               max = 29;
              }
              if (!isLeapYear) {
               max = 28;
              }
             }
             if (startMonth == 3 || startMonth == 5 || startMonth == 8 || startMonth == 10) {
              max = 30;
             }
             if (startMonth == 0 || startMonth == 2 || startMonth == 4 || startMonth == 6 || startMonth == 7 || startMonth == 9 || startMonth == 11) {
              max = 31;
             }
             
             //循環(huán)每個(gè)月
             //如果在日期范圍內(nèi)月份循環(huán)時(shí)自增到了一年的最后一個(gè)月就將月份初始化到一月份
             int y = 0;
             //如果是開始日期的第一個(gè)年的月數(shù)就從開始月數(shù)循環(huán)
             if (x == startYear) {
              y = startMonth;
             }
             for (; y < 12; y++) { 
              
              //獲取當(dāng)月的最大天數(shù);大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
              max = 0;
              if (y == 1) {
               if (isLeapYear) {
                max = 29;
               }
               if (!isLeapYear) {
                max = 28;
               }
              }
              if (y == 3 || y == 5 || y == 8 || y == 10) {
               max = 30;
              }
              if (y == 0 || y == 2 || y == 4 || y == 6 || y == 7 || y == 9 || y == 11) {
               max = 31;
              }
              
              int ty = y + 1;
              System.out.println(x + "年" + ty + "月");
              
              //循環(huán)每一天
              int z = 1;
              //如果是開始日期的第一個(gè)月的天數(shù)就從開始天數(shù)循環(huán)
              if (x == startYear && y == startMonth) {
               z = startDay;
              }
              for (; z <= max; z++) {
               count++;
               String str = x + "年" + ty + "月" + z + "日";//日期格式可以調(diào)整
               System.out.println(str);     
               dateList.add(str);
               double val = x + y * z * 100;//實(shí)際的值應(yīng)該從數(shù)據(jù)庫中獲取
               valList.add(new Double(val));
               if (x == endYear && y == endMonth && z == endDay) {
                break;
               }
              }


              //如果已經(jīng)遍歷過了截至日期的最后月份就中止月份的循環(huán)
              if (x == endYear && y == endMonth) {
               break;
              }
             
             }
            }
            
            System.out.println(start + " 到 " + end + " 的天數(shù)差:" + count);
            
           
            
          ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            String[] rowKeys = { "上限值", "下限值", "重量" };
            String[] columnKeys = new String[count];
            double[][] data = new double[3][count];
            
            for (int i = 0; i < count; i++) {
             columnKeys[i] = dateList.get(i);
             data[0][i] = 2500;
             data[1][i] = 1500;
             data[2][i] = valList.get(i).doubleValue();
            }
            
            
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);  
            
            JFreeChart chart = ChartFactory.createLineChart("工藝秤日稱重重量趨勢(shì)圖", "日期", "總量",
              dataset, PlotOrientation.VERTICAL, true, true, false);

            chart.setTextAntiAlias(false);
            chart.setBackgroundPaint(Color.WHITE);
            // 設(shè)置圖標(biāo)題的字體重新設(shè)置title
            Font font = new Font("隸書", Font.BOLD, 25);
            TextTitle title = new TextTitle("工藝秤日稱重重量趨勢(shì)圖");
            title.setFont(font);
            chart.setTitle(title);
            // 設(shè)置面板字體
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);

            chart.setBackgroundPaint(Color.WHITE);

            CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
            // x軸 // 分類軸網(wǎng)格是否可見
            categoryplot.setDomainGridlinesVisible(true);
            // y軸 //數(shù)據(jù)軸網(wǎng)格是否可見
            categoryplot.setRangeGridlinesVisible(true);

            categoryplot.setRangeGridlinePaint(Color.WHITE);// 虛線色彩

            categoryplot.setDomainGridlinePaint(Color.WHITE);// 虛線色彩

            categoryplot.setBackgroundPaint(Color.lightGray);

            // 設(shè)置軸和面板之間的距離
            // categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));

            CategoryAxis domainAxis = categoryplot.getDomainAxis();

            domainAxis.setLabelFont(labelFont);// 軸標(biāo)題

            domainAxis.setTickLabelFont(labelFont);// 軸數(shù)值

            domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的
            // Lable
            // 45度傾斜
            // 設(shè)置距離圖片左端距離

            domainAxis.setLowerMargin(0.0);
            // 設(shè)置距離圖片右端距離
            domainAxis.setUpperMargin(0.0);

            NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
            numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            numberaxis.setAutoRangeIncludesZero(true);

            // 獲得renderer 注意這里是下嗍造型到lineandshaperenderer!!
            LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
              .getRenderer();

            lineandshaperenderer.setBaseShapesVisible(true); // series 點(diǎn)(即數(shù)據(jù)點(diǎn))可見

            lineandshaperenderer.setBaseLinesVisible(true); // series 點(diǎn)(即數(shù)據(jù)點(diǎn))間有連線可見

            // 顯示折點(diǎn)數(shù)據(jù)
            // lineandshaperenderer.setBaseItemLabelGenerator(new
            // StandardCategoryItemLabelGenerator());
            // lineandshaperenderer.setBaseItemLabelsVisible(true);

            //打印到服務(wù)器
            FileOutputStream fos_jpg = null;
            //String dirs = "C:/workspace/test/map/";
            String dirs = "F:/test/";
            String fileName = "lineAndShap.png";
            String chartName = dirs + fileName;
            try {
             File file = new File(dirs);
             if (!file.exists()) {
              file.mkdirs();
             }   
             fos_jpg = new FileOutputStream(chartName);

             // 將報(bào)表保存為png文件
             ChartUtilities.writeChartAsPNG(fos_jpg, chart, 1500, 510);
            } catch (Exception e) {
             e.printStackTrace();
             return null;
            } finally {
             try {
              fos_jpg.close();
              System.out.println("ok");
             } catch (Exception e) {
              e.printStackTrace();
             }
            }
            
            //輸出到瀏覽器
            return categoryplot;
           }
           
          servlet的doGet方法中代碼

            response.setContentType("text/html");
            System.out.println("line");
            
            String factory = request.getParameter("factory");
            System.out.println(factory);
            
            MyLineAndShapeChart my = new MyLineAndShapeChart();
            CategoryPlot mm = new CategoryPlot();
            try {
             mm = my.getLineAndShapeChart();
            } catch (ParseException e) {
             e.printStackTrace();
            }
            JFreeChart chart = new JFreeChart("ssssssss", JFreeChart.DEFAULT_TITLE_FONT,
              mm, true);
            ChartRenderingInfo info = new ChartRenderingInfo(
              new StandardEntityCollection());
            String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300,
              info, request.getSession());

            String graphURL = request.getContextPath()
              + "/servlet/DisplayChart?filename=" + filename;

            RequestDispatcher rd = request.getRequestDispatcher("../form/g.jsp");
            request.getSession().setAttribute("filename", filename);
            request.getSession().setAttribute("graphURL", graphURL);
            rd.forward(request, response);
           
          webInfo下的g.jsp代碼
          <%@ page contentType="text/html;charset=GBK"%>
          <HTML>
           <HEAD>
           </HEAD>
           <BODY>
            <P ALIGN="CENTER">
             <img src="${graphURL}" width=500 height=300 border=0
              usemap="${filename}">
            </P>
           </BODY>
          </HTML>

           web.xml 文件中內(nèi)容(重要)

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
           
           <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>AServlet</servlet-name>
            <servlet-class>servlet.AServlet</servlet-class>
           </servlet>
           <servlet-mapping>
            <servlet-name>AServlet</servlet-name>
            <url-pattern>/servlet/AServlet</url-pattern>
           </servlet-mapping>
          </web-app>



          柳德才
          13691193654
          18942949207
          QQ:422157370
          liudecai_zan@126.com
          湖北-武漢-江夏-廟山

          posted on 2009-01-14 11:47 liudecai_zan@126.com 閱讀(2249) 評(píng)論(2)  編輯  收藏 所屬分類: JFreeChart

          評(píng)論

          # re: 生成兩個(gè)日期間的以天為間隔的折線圖(web方式和控制臺(tái)方式) 2009-01-14 13:07 yz

          有個(gè)圖看就好了!  回復(fù)  更多評(píng)論   

          # re: 生成兩個(gè)日期間的以天為間隔的折線圖(web方式和控制臺(tái)方式) 2009-01-15 08:29 liudecai_zan@126.com

          計(jì)劃數(shù)據(jù)要從數(shù)據(jù)庫中取,在這里為了簡(jiǎn)化就用簡(jiǎn)單方式處理是數(shù)據(jù)不一樣一邊看出效果,但是效果肯定不夠真實(shí),所以就。。。。。。
          double val = x + y * z * 100;//實(shí)際的值應(yīng)該從數(shù)據(jù)庫中獲取  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 定远县| 武陟县| 永仁县| 赤壁市| 皮山县| 东城区| 离岛区| 天全县| 寿宁县| 任丘市| 边坝县| 泌阳县| 四平市| 靖远县| 华池县| 崇明县| 沙湾县| 民县| 拉孜县| 克什克腾旗| 肥乡县| 光泽县| 鹤庆县| 浪卡子县| 永吉县| 淳安县| 东源县| 夹江县| 奉节县| 民县| 庆云县| 宝应县| 庆安县| 光泽县| 望都县| 康马县| 修水县| 康保县| 桂东县| 浦东新区| 榆中县|