java課程設(shè)計(jì)報告—萬年歷——詹永堂.doc_第1頁
java課程設(shè)計(jì)報告—萬年歷——詹永堂.doc_第2頁
java課程設(shè)計(jì)報告—萬年歷——詹永堂.doc_第3頁
java課程設(shè)計(jì)報告—萬年歷——詹永堂.doc_第4頁
java課程設(shè)計(jì)報告—萬年歷——詹永堂.doc_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余17頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java程序設(shè)計(jì)課程設(shè)計(jì)報告題 目: 萬年歷 學(xué) 院: 計(jì)算機(jī)科學(xué)與工程學(xué)院 專 業(yè): 信息管理與信息系統(tǒng) 學(xué)生姓名: 詹永堂 學(xué) 號: 1100340129 指導(dǎo)教師: 汪華登 2013年 6 月 30 日21目 錄目錄前言31需求分析31.1需求分析31.2功能設(shè)計(jì)32.概要設(shè)計(jì)42.1程序設(shè)計(jì)思路42.2程序運(yùn)行界面42.3流程圖53.各模塊的功能及程序說明53.1.初始化組件53.2.初始化數(shù)據(jù)63.3.繪制程序界面73.4計(jì)算各個月的天數(shù)83.5年份輸入控制93.6獲取點(diǎn)擊表格詳細(xì)日期103.7打印日期113.8國際時間系統(tǒng)調(diào)用顯示113.9顯示系統(tǒng)時間123.10農(nóng)歷計(jì)算模塊124測試分析206課程設(shè)計(jì)體會20參考文獻(xiàn)21前言1995年,Java語言的名字從Oak編程了Java。1997年J2SE1.1發(fā)布。1998年J2SE1.2發(fā)布,標(biāo)志Java2的誕生。十多年來,Java編程語言及平臺成功地運(yùn)用在網(wǎng)絡(luò)計(jì)算及移動等各個領(lǐng)域。Java的體系結(jié)構(gòu)由Java語言、Java class、Java API、Java虛擬機(jī)組成。它具有簡單、面向?qū)ο?、健壯、安全、結(jié)構(gòu)中立、可移植和高效能等眾多優(yōu)點(diǎn)。Java支持多線程編程,Java運(yùn)行時系統(tǒng)在多線程同步方面具有成熟的解決方案。Java的平臺標(biāo)準(zhǔn)有Java ME,Java SE和Java EE。Java發(fā)展到今天,它的卓越成就及在業(yè)界的地位毋庸置疑。本次課程設(shè)計(jì)開發(fā)平臺使用Eclipse。參照J(rèn)DK幫助。1需求分析1.1需求分析本程序的要求為:(1)能夠顯示實(shí)現(xiàn)1800-2100年的日期,包括公歷、農(nóng)歷、星期、二十四節(jié)氣。(2)能夠按照月份格式顯示,或按照星期格式顯示。(3)能夠顯示系統(tǒng)時間。(4) 能夠設(shè)置鬧鐘。(5)能夠查詢?nèi)舾蓢H大城市(分布在不同時區(qū))的時間。1.2功能設(shè)計(jì)本程序要構(gòu)建的萬年歷程序,其功能有以下幾個方面:一、設(shè)計(jì)程序運(yùn)行界面,具有顯示各種功能的面板模塊,并對各功能按鈕就行時間監(jiān)聽;二、程序需要顯示1800年到2100年的日歷,包括公歷、農(nóng)歷、時間所對應(yīng)的星期。要求系統(tǒng)能夠從界面上的操作獲取公歷日期,計(jì)算其所對應(yīng)的星期和相應(yīng)的農(nóng)歷并顯示到界面上;三、程序要求顯示系統(tǒng)時間,并能設(shè)置鬧鈴。要求可以自己設(shè)置一個時間點(diǎn),在這一時間點(diǎn)做出相應(yīng)的響應(yīng);四、查詢顯示若干國際城市不同時區(qū)的時間,這里只需要調(diào)用Java的系統(tǒng)里就可以解決。五、對時間的更新,日歷顯示要求關(guān)聯(lián)系統(tǒng)時間,能在進(jìn)入程序時顯示系統(tǒng)時間對應(yīng)的日歷,并能返回當(dāng)天日歷;六、程序界面的美觀設(shè)計(jì)和人性化結(jié)構(gòu),要求具有良好的人機(jī)交互,容易理解界面內(nèi)容,易操作;七、就現(xiàn)在的水平來說,功能1、2、3、5是可以實(shí)現(xiàn),功能4 有待研究,可能遇到的問題是按鈕對時間的監(jiān)聽處理可能難度較大,還有就是在公歷轉(zhuǎn)農(nóng)歷中可能比較難獲取相應(yīng)的公歷變化日期 。2.概要設(shè)計(jì)2.1程序設(shè)計(jì)思路1. 總天數(shù)的算法:首先用if語句判斷定義年到輸入年之間每一年是否為閏年,是閏年,該年的總天數(shù)為366,否則,為365。然后判斷輸入的年是否為定義年,若是,令總天數(shù)S=1,否則,用累加法計(jì)算出定義年到輸入年之間的總天數(shù),再把輸入年的一月到要輸出的月份之間的天數(shù)累加起來,若該月是閏年中的月份并且該月還大于二月,再使總天數(shù)加1,否則,不加,既算出從定義年一月一日到輸出年的該月一日的總天數(shù)。2. 輸出月份第一天為星期幾的算法:使總天數(shù)除以7取余加2得幾既為星期幾,若是7,則為星期日。3. 算出輸出月份第一天為星期幾的算法:算出輸出月份第一天為星期幾后,把該日期以前的位置用空格補(bǔ)上,并總該日起一次輸出天數(shù)直到月底,該月中的天數(shù)加上該月一日為星期幾的數(shù)字再除以7得0換行,即可完整的輸出該月的日歷。4.獲取系統(tǒng)時間,計(jì)算當(dāng)天農(nóng)歷日期并顯示2.2程序運(yùn)行界面2.3流程圖程序初始化獲取當(dāng)前系統(tǒng)時間年份等數(shù)據(jù)提交年月變更數(shù)據(jù) 是否輸入年份或選擇月份開始計(jì)算,繪制屏幕結(jié)束計(jì)算農(nóng)歷3.各模塊的功能及程序說明3.1.初始化組件 import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Locale;import java.util.TimeZone;3.2.初始化數(shù)據(jù)public class wannianli extends JFrame implements ActionListener, MouseListener private Calendar cld = Calendar.getInstance();/獲取一個Calendar類的實(shí)例對象private String astr = 星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日 ;private DefaultTableModel dtm = new DefaultTableModel(null, astr);private JTable table = new JTable(dtm);private JScrollPane sp = new JScrollPane(table);private JButton bLastYear = new JButton(上一年);private JButton bNextYear = new JButton(下一年);private JButton bLastMonth = new JButton(上月);private JButton bNextMonth = new JButton(下月);private JPanel p1 = new JPanel(); / 設(shè)立八個中間容器,裝入布局控制日期的按鈕模塊private JPanel p2 = new JPanel(new GridLayout(3,2);/網(wǎng)格布局private JPanel p3 = new JPanel(new BorderLayout();/邊界布局private JPanel p4 = new JPanel(new GridLayout(2,1);private JPanel p5 = new JPanel(new BorderLayout(); private JPanel p6 = new JPanel(new GridLayout(2,2); private JPanel p7 = new JPanel(new GridLayout(2,1); private JPanel p8 = new JPanel(new BorderLayout(); private JComboBox timeBox = new JComboBox(TimeZone.getAvailableIDs();/對所有支持時區(qū)進(jìn)行迭代,獲取所有的id;private JTextField jtfYear = new JTextField(5);/ jtfYeaar年份顯示輸入框private JTextField jtfMonth = new JTextField(2);/ jtfMouth月份顯示輸入框private JTextField timeField=new JTextField();/各城市時間顯示框private static JTextArea jta = new JTextArea(10,5);/農(nóng)歷顯示區(qū)private JScrollPane jsp = new JScrollPane(jta);private JLabel l = new JLabel(花江小精靈:親!你可以直接輸入年月查詢.);private JLabel lt = new JLabel();private JLabel ld = new JLabel();private JLabel lu = new JLabel(農(nóng)歷和節(jié)氣);private JLabel null1=new JLabel();private int lastTime;/private String localTime = null;private String s = null;private SimpleDateFormat dateFormat=new SimpleDateFormat(yyyy年MM月dd日 hh時mm分ss秒);3.3.繪制程序界面public wannianli() super(花江日歷 過去僅留追憶,未來剛生憧憬,唯有堅(jiān)守本心,把握今天 ZYT 詹永堂 );/ 框架命名this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗口關(guān)閉函數(shù)this.getContentPane().setLayout(new BorderLayout(9, 10);jta.setLineWrap(true);/ 長度大于分配長度時候則換行jta.setFont(new Font(黑體, Font.BOLD, 16);table.setBackground(Color.white);table.setGridColor(Color.pink);/ 星期之間的網(wǎng)格線是灰色的table.setBackground(Color.white);table.setColumnSelectionAllowed(true);/ 將table中的列設(shè)置為可選擇table.setSelectionBackground(Color.pink);/ 當(dāng)選定時背景顏色為黑色table.setSelectionForeground(Color.GREEN);table.setBackground(new Color(184,207, 229);/ 日期顯示表格為淺藍(lán)色table.setFont(new Font(黑體, Font.BOLD, 24);/ 日期數(shù)字字體格式table.setRowHeight(26);/ 表格的高度table.addMouseListener(this); / 鼠標(biāo)監(jiān)聽器、lu.setFont(new Font(黑體, Font.BOLD, 22);/農(nóng)歷標(biāo)簽格氏jtfYear.addActionListener(this);/ 可輸入年份的文本框/ 為各個按鈕添加監(jiān)聽函數(shù)bLastYear.addActionListener(this);bNextYear.addActionListener(this);bLastMonth.addActionListener(this);bNextMonth.addActionListener(this);timeBox.addItemListener(new TimeSelectedChangedListener();/ 將按鈕添加到Jpane上p1.add(bLastYear);p1.add(jtfYear);/ 年份輸入文本框p1.add(bNextYear);p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p3.add(jsp, BorderLayout.SOUTH);p3.add(lu,BorderLayout.CENTER);p3.add(ld, BorderLayout.NORTH);p4.add(lt);p4.add(l);p5.add(p4, BorderLayout.SOUTH);p5.add(sp, BorderLayout.CENTER);p5.add(p1, BorderLayout.NORTH);p6.add(timeBox);p6.add(null1);p6.add(timeField); p8.add(p2,BorderLayout.CENTER);p8.add(p7,BorderLayout.SOUTH);this.getContentPane().add(p3, BorderLayout.EAST);this.getContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p6,BorderLayout.SOUTH);this.getContentPane().add(p8,BorderLayout.WEST);String strDate = DateFormat.getDateInstance().format(new Date().split(-);/ 獲取日期 cld.set(Integer.parseInt(strDate0), Integer.parseInt(strDate1) - 1,0);showCalendar(Integer.parseInt(strDate0),Integer.parseInt(strDate1), cld);jtfMonth.setEditable(false);/ 設(shè)置月份文本框?yàn)椴豢删庉媕tfYear.setText(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(新宋體, Font.BOLD, 24);new Timer(lt).start();new TimeThread().start();this.setBounds(200, 200, 700, 350);this.setResizable(false);this.setVisible(true);3.4計(jì)算各個月的天數(shù) 運(yùn)用if語句判斷各個月的最大天數(shù) public int getDaysOfMonth(int Year, int Month) /計(jì)算各月的天數(shù)if(Month=1|Month=3|Month=5|Month=7|Month=8|Month=10|Month=12)return 31;if(Month=4|Month=6|Month=9|Month=11)return 30;if(Year%4=0&Year%100!=0|Year%400=0)/閏年return 29;else return 28;3.5年份輸入控制這個監(jiān)聽事件用于監(jiān)聽程序界面的操作,獲取年月的相應(yīng)數(shù)據(jù),用if語句對月份操作進(jìn)行控制,如當(dāng)前年月為1992年1月時,點(diǎn)擊“上一月”,年份減1,月份為12 ,即為1991年12月;當(dāng)前月份為12時,點(diǎn)擊“下一月”,年份加1,月份為1,如圖public void actionPerformed(ActionEvent e)/從界面上獲取年月數(shù)據(jù) if(e.getSource() = jtfYear | e.getSource() = bLastYear | e.getSource() = bNextYear | e.getSource() = bLastMonth | e.getSource() = bNextMonth) int m, y; try/控制輸入的年份正確,異??刂?if (jtfYear.getText().length() != 4) throw new NumberFormatException(); y = Integer.parseInt(jtfYear.getText(); m = Integer.parseInt(jtfMonth.getText(); catch (NumberFormatException ex) JOptionPane.showMessageDialog(this, 請輸入4位0-9的數(shù)字!, 年份有誤, JOptionPane.ERROR_MESSAGE); return; ld.setText(沒有選擇日期); for (int i = 0; i 0x8; i = 1) if (lunarInfoy - 1900 & i) != 0) sum += 1; return (sum + leapDays(y); / 傳回農(nóng)歷 y年閏月的天數(shù) final private static int leapDays(int y) if (leapMonth(y) != 0) if (lunarInfoy - 1900 & 0x10000) != 0) return 30; else return 29; else return 0; / 傳回農(nóng)歷 y年閏哪個月 1-12 , 沒閏傳回 0 final private static int leapMonth(int y) return (int) (lunarInfoy - 1900 & 0xf); /傳回農(nóng)歷 y年m月的總天數(shù) final private static int monthDays(int y, int m) if (lunarInfoy - 1900 & (0x10000 m) = 0) return 29; else return 30; / 傳回農(nóng)歷 y年的生肖 final public static String AnimalsYear(int y) return Animals(y - 4) % 12; /傳入 月日的offset 傳回干支,0=甲子 final private static String cyclicalm(int num) return (Gannum % 10 + Zhinum % 12); / 傳入 offset 傳回干支, 0=甲子 final public static String cyclical(int y) int num = y - 1900 + 36; return (cyclicalm(num); / 傳出農(nóng)歷.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6 final private long Lunar(int y, int m) long nongDate = new long7; int i = 0, temp = 0, leap = 0; Date baseDate = new GregorianCalendar(1900 + 1900, 1, 31).getTime(); Date objDate = new GregorianCalendar(y + 1900, m, 1).getTime(); long offset = (objDate.getTime() - baseDate.getTime() / 86400000L; if (y 2000) offset += year20m - 1; if (y = 2000) offset += year2000m - 1; nongDate5 = offset + 40; nongDate4 = 14; for (i = 1900; i 0; i+) temp = lYearDays(i); offset -= temp; nongDate4 += 12; if (offset 0) offset += temp; i-; nongDate4 -= 12; nongDate0 = i; nongDate3 = i - 1864; leap = leapMonth(i); / 閏哪個月 nongDate6 = 0; for (i = 1; i 0; i+) / 閏月 if (leap 0 & i = (leap + 1) & nongDate6 = 0) -i; nongDate6 = 1; temp = leapDays(int) nongDate0); else temp = monthDays(int) nongDate0, i); / 解除閏月 if (nongDate6 = 1 & i = (leap + 1) nongDate6 = 0; offset -= temp; if (nongDate6 = 0) nongDate4+; if (offset = 0 & leap 0 & i = leap + 1) if (nongDate6 = 1) nongDate6 = 0; else nongDate6 = 1; -i; -nongDate4; if (offset 0) offset += temp; -i; -nongDate4; nongDate1 = i; nongDate2 = offset + 1; return nongDate; / 傳出y年m月d日對應(yīng)的農(nóng)歷.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6 final public static long calElement(int y, int m, int d) long nongDate = new long7; int i = 0, temp = 0, leap = 0; Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime(); Date objDate = new GregorianCalendar(y, m - 1, d).getTime(); long offset = (objDate.getTime() - baseDate.getTime() / 86400000L; nongDate5 = offset + 40; nongDate4 = 14; for (i = 1900; i 0; i+) temp = lYearDays(i); offset -= temp; nongDate4 += 12; if (offset 0) offset += temp; i-; nongDate4 -= 12; nongDate0 = i; nongDate3 = i - 1864; leap = leapMonth(i); / 閏哪個月 nongDate6 = 0; for (i = 1; i 0; i+) / 閏月 if (leap 0 & i = (leap + 1) & nongDate6 = 0) -i; nongDate6 = 1; temp = leapDays(int) nongDate0); else temp = monthDays(int) nongDate0, i); / 解除閏月 if (nongDate6 = 1 & i = (leap + 1) nongDate6 = 0; offset -= temp; if (nongDate6 = 0) nongDate4+; if (offset = 0 & leap 0 & i = leap + 1) if (nongDate6 = 1) nongDate6 = 0; else nongDate6 = 1; -i; -nongDate4; if (offset 0) offset += temp; -i; -nongDate4; nongDate1 = i; nongDate2 = offset + 1; return nongDate; public final static String getChinaDate(int day) String a = ; if (day = 10) return 初十; if (day = 20) return 二十; if (day = 30) return 三十; int two = (int) (day) / 10); if (two = 0) a = 初; if (two

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論