




已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
北京郵電大學(xué)Java程序設(shè)計Java程序設(shè)計題目:課程作業(yè)三實(shí)驗報告 一、 題目要求作業(yè)要求:按如下要求編寫圖形用戶界面程序,最后提交紙質(zhì)報告報告要求:包括設(shè)計思路、關(guān)鍵代碼及運(yùn)行結(jié)果題目:在以下題目中任選一題,也可以自由發(fā)揮,要求使用Java事件處理機(jī)制。Java簡易計算器Java日歷軟件Java記事本Java學(xué)生信息管理系統(tǒng)二、 設(shè)計思路1、 設(shè)計圖形界面我們期望的圖形界面大概是這個樣子:XXXX年XX月日一二三四五六年份:1234(輸入框)567891011月份:12131415161718(輸入框)19202122232425查詢按鈕2627282930備忘:(輸入框)其中,只要在年份和月份對應(yīng)的輸入框中,輸入一個年份、月份,按下查詢按鍵,日歷即可顯示,最頂上的標(biāo)題可以動態(tài)更新。這是各個組件的關(guān)系示意圖,其中,圖中的p0、p1、p2為JPanel對象,方便安排我們的格局;label0、label1、label2三個對象,為JLable對象,用于顯示三個標(biāo)簽,text1、text2、text3三個對象,為JTextField對象,用于輸入年份月份,button1為JButton對象,用于按下以查詢?nèi)諝v。2、 程序流程圖程序開始顯示2014年12月的日歷,當(dāng)輸入一個年份和月份時,判斷是否合法,合法則輸出該月的日歷,不合法則輸出一個空日歷。3、 程序邏輯框圖 以上是我們程序的邏輯框圖。首先利用leapYear()判斷這一年是否為閏年;然后利用getMonthDay(),各個月份的日期相加,求出1800年以來,這個月之前共有多少天;然后利用getStartDay(),求出這個月開始的一天為星期幾,再配合getMonthDay(),即可得到該月的日歷。再使用Showcal(),修改內(nèi)部參數(shù),即可在程序中顯示出來。三、 關(guān)鍵代碼分析 構(gòu)造方法:public cal() super(2012210637鄭晨宇Java作業(yè)日歷軟件); /框架命名 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/窗口關(guān)閉函數(shù)this.setBounds(400,150,550,340);/設(shè)置窗口的位置和大小Container c=getContentPane(); p1 = new JPanel();/面板對象, p3 = new JPanel(new GridLayout(8,1,3,3);/在面板對象p3里使用網(wǎng)格布局管理器 p2 = new JPanel(new GridLayout(7,7,10,1);/網(wǎng)格布局管理器 label0=new JLabel(年份:);/標(biāo)簽組件 label1=new JLabel(月份:); label2=new JLabel(備忘錄:); label3=new JLabel(); text1=new JTextField(2014,1);/文本框 text2=new JTextField(12,1); text3=new JTextField(1); button1=new JButton(查看);/按鈕 int i;/中心面板中各個標(biāo)簽初始化(用顯示日歷7行7列)for(i=0;i7;i+) p2.add(aii=new JLabel(asti);/第一行顯示是周幾(星期日到星期六) for (i= 7; i 49; i+) p2.add(aii=new JLabel();/暫時為空,在showcal中具體定義各月不同的顯示 p3.add(label0); p3.add(text1); p3.add(label1); p3.add(text2); p3.add(button1); p3.add(label2); p3.add(text3); p1.add(label3); setVisible(true); c.add(p1,BorderLayout.NORTH); c.add(p3,BorderLayout.EAST); c.add(p2,BorderLayout.CENTER); button1.addActionListener(this);/注冊年份、月份輸入和ok按鈕監(jiān)聽器 this.setVisible(true);/窗口可見 /main主函數(shù) 這個構(gòu)造方法首先構(gòu)造了一個JFrame對象并初始化,然后將各個標(biāo)簽、輸入框、按鍵賦初值,填入預(yù)定的panel中,在將panel填入框架的指定位置,最后設(shè)定了按鍵的監(jiān)聽器。由于cal類已經(jīng)實(shí)現(xiàn)了ActionListener接口(實(shí)現(xiàn)過程見后),所以使用該對象作為事件處理器即可。 actionPerformed方法public void actionPerformed (ActionEvent e) if(e.getSource() = button1) try/控制輸入的年份正確,異??刂?if (text1.getText().length() != 4) throw new NumberFormatException(); catch (NumberFormatException ex) return; String s1=text1.getText();/得到輸入的年份 year=Integer.parseInt(s1);/將年份轉(zhuǎn)換為int型,year為靜態(tài)變量 String s2=text2.getText();/月份,同年份處理 month=Integer.parseInt(s2); showcal(year,month);/調(diào)用顯示日歷的函數(shù) /showcal:在中間面板中顯示網(wǎng)格布局之后的日歷主界面 當(dāng)button按下時,產(chǎn)生了一個ActionEvent,被注冊的事件監(jiān)聽器捕捉到。捕捉后,首先將年份和月份轉(zhuǎn)換為int型,再調(diào)用showcal函數(shù)(實(shí)現(xiàn)過程見后),顯示這個月的日歷。 showcal方法public void showcal(int year,int month) int monthDay=getMonthDay(year,month);/得到一個月有多少天 int startDay=getStartDay(year,month);/得到每個月開始是周幾 /顯示當(dāng)前窗口中顯示日歷的年月 String rr=+Integer.toString(year)+年+Integer.toString(month)+月; label3.setText(rr); /控制各月日歷的正確顯示 int i; for (i= 7; i startDay+7; i+) aii.setText(); for (i =startDay+7;istartDay + monthDay + 7;i+) String bb;/存在意義:便于實(shí)現(xiàn)setText函數(shù)的帶格式輸入 if(i-startDay-610) bb= +Integer.toString(i-startDay-6);/將int型轉(zhuǎn)換為String型 else bb= +Integer.toString(i-startDay-6); aii.setText(bb); for(i=startDay + monthDay + 7;i49;i+) aii.setText(); 首先調(diào)用getMonthDay 和getStartDay方法(實(shí)現(xiàn)方法見后),獲得這個月共有多少天,和這個月開始的一天是星期幾,這樣就得到了本月的日歷。然后將該月的日歷保存到數(shù)組ai中,用來顯示。 leapYear方法public static boolean leapYear(int year) if (year % 400 = 0) | (year % 4 = 0) & (year % 100 != 0) return true; elsereturn false; 這個方法判斷這一年是不是閏年。程序較為簡單,不再贅述。 getMonthDay方法public static int getMonthDay(int year, int month) 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(month = 2) if (leapYear(year)/閏年二月29天 return 29; else return 28; return 0; /if month is incorrect./如果月份輸入錯誤返回0. 這個方法用來得到這個月共有多少天。程序較為簡單,不再贅述。 getStartDay方法public static int getStartDay(int year,int month) /從1800年1月1日開始 int startDay1800 = 3; long totalDays = getTotalDays(year, month); return (int)(totalDays + startDay1800) % 7); 這個方法用來得到這個月的第一天是星期幾。程序較為簡單,不再贅述。 getTotalDays方法public static long getTotalDays(int year, int month) long total = 0; for (int i = 1800; i year; i+) if (leapYear(i) total = total + 366; else total = total + 365; for (int i = 1; i month; i+) total = total + getMonthDay(year, i); return total; 這個方法遍歷1800年之后的各年和本年的各月份,獲得在這個月份之前,共有多少天(以1800年1月1日為起點(diǎn))。四、 程序運(yùn)行結(jié)果1、 進(jìn)入程序進(jìn)入程序后,程序顯示2014年12月的日歷,日歷正確。2、 修改日期我們修改日期(2015年1月)以后,點(diǎn)擊查詢鍵,日歷正確顯示了2015年的日歷。點(diǎn)擊右上角紅叉可以退出程序。五、 源程序import java.awt.*; import java.awt.event.*; import javax.swing.*; public class cal extends JFrame implements ActionListener static int year,month; /設(shè)置靜態(tài)變量便于計算方法的實(shí)現(xiàn) private String ast = 日, 一, 二, 三, 四, 五, 六; private JLabel ai = new JLabel49; private JLabel label0,label1,label2,label3; /標(biāo)簽 private JTextField text1,text2,text3; /輸入框 private JButton button1; /按鈕 private JPanel p3,p1,p2; /面板 public cal() super(2012210637鄭晨宇Java作業(yè)日歷軟件); /框架命名 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/窗口關(guān)閉函數(shù)this.setBounds(400,150,550,340);/設(shè)置窗口的位置和大小Container c=getContentPane(); p1 = new JPanel();/面板對象, p3 = new JPanel(new GridLayout(8,1,3,3);/在面板對象p3里使用網(wǎng)格布局管理器 p2 = new JPanel(new GridLayout(7,7,10,1);/網(wǎng)格布局管理器 label0=new JLabel(年份:);/標(biāo)簽組件 label1=new JLabel(月份:); label2=new JLabel(備忘錄:); label3=new JLabel(); text1=new JTextField(2014,1);/文本框 text2=new JTextField(12,1); text3=new JTextField(1); button1=new JButton(查看);/按鈕 int i;/中心面板中各個標(biāo)簽初始化(用顯示日歷7行7列)for(i=0;i7;i+) p2.add(aii=new JLabel(asti);/第一行顯示是周幾(星期日到星期六) for (i= 7; i 49; i+) p2.add(aii=new JLabel();/暫時空,在showcal中具體定義各月不同的顯示 p3.add(label0); p3.add(text1); p3.add(label1); p3.add(text2); p3.add(button1); p3.add(label2); p3.add(text3); p1.add(label3); setVisible(true); c.add(p1,BorderLayout.NORTH); c.add(p3,BorderLayout.EAST); c.add(p2,BorderLayout.CENTER); button1.addActionListener(this);/注冊年份、月份輸入和ok按鈕監(jiān)聽器/ text1.addActionListener(this); / text2.addActionListener(this); this.setVisible(true);/窗口可見 /main主函數(shù) public static void main(String args) cal a=new cal(); a.showcal(2014,12);/初始化顯示2013年6月日歷 /事件處理方法 public void actionPerformed (ActionEvent e) /e.getSource() = text1 | e.getSource() = text2 | if(e.getSource() = button1) try/控制輸入的年份正確,異常控制 if (text1.getText().length() != 4) throw new NumberFormatException(); catch (NumberFormatException ex) return; String s1=text1.getText();/得到輸入的年份 year=Integer.parseInt(s1);/將年份轉(zhuǎn)換為int型,year為靜態(tài)變量 String s2=text2.getText();/月份,同年份處理 month=Integer.parseInt(s2); showcal(year,month);/調(diào)用顯示日歷的函數(shù) /showcal:在中間面板中顯示網(wǎng)格布局之后的日歷主界面 public void showcal(int year,int month) int monthDay=getMonthDay(year,month);/得到一個月有多少天 int startDay=getStartDay(year,month);/得到每個月開始是周幾 /顯示當(dāng)前窗口中顯示日歷的年月 String rr=+Integer.toString(year)+年+Integer.toString(month)+月; label3.setText(rr); /控制各月日歷的正確顯示 int i; for (i= 7; i startDay+7; i+) aii.setText(); for (i =startDay+7;istartDay + monthDay + 7;i+) String bb;/存在意義:便于實(shí)現(xiàn)setText函數(shù)的帶格式輸入 if(i-startDay-610) bb= +Integer.toString(i-startDay-6);/int型轉(zhuǎn)換為String型 else bb= +Integer.toString(i-startDay-6); aii.setText(bb); for(i=startDay + monthDay + 7;i49;i+) aii.setText(); /leapYear:判斷是否為閏年 public static boolean leapYear(int year) if (year % 400 = 0) | (year % 4 = 0) & (year % 100 != 0) return true; elsereturn false; /getMonthDay:每月總天數(shù) public static int
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商運(yùn)營專員崗位面試問題及答案
- 電機(jī)研發(fā)助理崗位面試問題及答案
- 財務(wù)顧問崗位面試問題及答案
- 太赫茲技術(shù)工程師崗位面試問題及答案
- 上海市延安初級中學(xué)2025屆高一下化學(xué)期末質(zhì)量檢測試題含解析
- 2025屆云南省昭通市大關(guān)縣第二中學(xué)高二化學(xué)第二學(xué)期期末學(xué)業(yè)水平測試試題含解析
- 廣東省聯(lián)考聯(lián)盟2025屆化學(xué)高一下期末監(jiān)測模擬試題含解析
- 供水公司窨井管理辦法
- 檔案項目流程管理辦法
- 農(nóng)機(jī)人力資源管理辦法
- 2025區(qū)域型變電站智能巡視系統(tǒng)技術(shù)規(guī)范
- 財務(wù)報表編制與審核合同模板
- 上海閔行區(qū)教育系統(tǒng)招聘實(shí)驗員考試真題2024
- 建設(shè)部建設(shè)工程重大質(zhì)量安全事故應(yīng)急預(yù)案
- 2025年中航油招聘筆試參考題庫附帶答案詳解
- 2024年中國中高端電子鋁箔行業(yè)市場調(diào)查報告
- DB54∕T 0275-2023 民用建筑節(jié)能技術(shù)標(biāo)準(zhǔn)
- 2025年人教版小學(xué)五年級英語(下冊)期末試卷及答案
- 交通貨運(yùn)企業(yè)-隱患排查治理和防控制度
- 中煙公司財務(wù)管理制度
- 《學(xué)習(xí)雷鋒精神爭主題班會》課件
評論
0/150
提交評論