第一篇:ATM自助取款機(jī)系統(tǒng)java代碼(大全)
public void actionPerformed(ActionEvent e)
//界面顯示控制 {
String IC_Number=“";
String password=”“;String IC_No=”“;
z30.setVisible(false);
float
leftmoney=0;
float
moneys=0;
float mon=0;
float money1=0;
float money2=0;
if(true)
{int No_50=0,No_100=0;
String strin=”select NO_50,NO_100 from ATM ATM_ID='123456789'“;ResultSetrsSQLSelect=executeQuery(strin);try{ if(rsSQLSelect.next())
{
No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));
No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));
where
}
}
catch(Exception er){System.out.println(”查詢ATM機(jī)信息出錯!“);}
if(No_50==0&&No_100==0)
{
z1.setVisible(false);
t1.setText(”對不起,本ATM自動取款機(jī)暫停服務(wù)!“);cl.show(c,”1“);
}
}
cl.show(c,”1“);
if(e.getSource()==z1)
{
t3.setText(”“);
text1.setText(”“);cl.show(c,”2“);
}
if(e.getSource()==z4||e.getSource()==z6||e.getSource()==z11||e.getSource()==z16||e.getSource()==z18||e.getSource()==z22)
{ closeDBConnection();cl.show(c,”1“);
}
if(e.getSource()==z2)
{ closeDBConnection();System.exit(0);
}
if(e.getSource()==z3){ IC_Number=text1.getText().trim();
if(getname(IC_Number))
{z5.setVisible(true);
pw1.setVisible(true);
t4.setVisible(true);
pw1.setText(”“);
t5.setText(”“);cl.show(c,”3“);
}
else
{
t3.setText(”您輸入的卡號不存在,請重新輸入!“);cl.show(c,”2“);
}
}
if(e.getSource()==z5){
password=pw1.getText().trim();IC_Number=text1.getText().trim();
if(!login(IC_Number,password))
{
t5.setText(”您輸入的密碼錯誤,請重新輸入!“);
pw1.setText(”“);
n--;cl.show(c,”3“);
}
else
{
t5.setText(”“);cl.show(c,”4“);
}
if(n<0)
{
n=2;
t5.setText(”您已經(jīng)三次輸入錯誤密碼,謝謝您的使用,歡迎下次光臨!“);
z5.setVisible(false);
pw1.setVisible(false);
t4.setVisible(false);cl.show(c,”3“);
}
}
if(e.getSource()==z7)
{
t33.setText(”“);cl.show(c,”5“);
}
if(e.getSource()==z8)
//余額查詢 { DBAccess d=new DBAccess();
String str3=”“;
String stri=”“;IC_Number=text1.getText().trim();
t29.setText(IC_Number);leftmoney=getmoney(IC_Number);
t30.setText(Float.toString(leftmoney));stri=”select bank_name from IC,bank where IC.bank_NO=bank.bank_NO and IC_ID='“+IC_Number+”'“;ResultSetrsSQLSelect=d.executeQuery(stri);try{
if(rsSQLSelect.next())
{
str3=rsSQLSelect.getString(”bank_name“);
//d.commit();
}
} catch(Exception er){}
t32.setText(str3);cl.show(c,”10“);
}
if(e.getSource()==z9)
{
t23.setText(”“);cl.show(c,”9“);
}
if(e.getSource()==z10)
{
t28.setText(”“);cl.show(c,”11“);
}
if(e.getSource()==z12){ DBAccess d=new DBAccess();IC_Number=text1.getText().trim();fetchmoney=Integer.parseInt(text2.getText());
if(fetchmoney<=0)
{
t9.setText(”取款金額非法!請重新輸入!“);
text2.setText(”“);cl.show(c,”6“);
return;
}
if(fetchmoney>1000)
{
t9.setText(”每次交易金額最大為1000元!“);
text2.setText(”“);cl.show(c,”6“);return;
}
if(fetchmoney%50!=0)
{
t9.setText(”取款金額只能為50的倍數(shù)!“);
text2.setText(”“);cl.show(c,”6“);return;
} leftmoney=getmoney(IC_Number);
if(fetchmoney>leftmoney)
{
t9.setText(”您的余額不足,請重新輸入取款金額!“);
text2.setText(”“);cl.show(c,”6“);return;
}
int No_50=0,No_100=0,x_50=0,x_100=0,mo=0;
String str1=”select NO_50,NO_100 from ATM where ATM_ID='123456789'“;ResultSetrsSQLSelect=d.executeQuery(str1);try{ if(rsSQLSelect.next())
{
No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));
No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));
}
}
catch(Exception er){System.out.println(”查詢ATM機(jī)信息出錯!“);}
x_100=fetchmoney/100;
if(No_100 { mo=fetchmoney-No_100*100; x_50=mo/50; if(x_50>No_50) { t9.setText(”取款機(jī)現(xiàn)鈔不足!“); text2.setText(”“);cl.show(c,”6“); return; } else { No_50=No_50-x_50; No_100=0; } } else { No_100=No_100-x_100; x_50=(fetchmoney-x_100*100)/50; if(x_50>No_50) { t9.setText(”取款機(jī)50面值現(xiàn)鈔不足!“); text2.setText(”“);cl.show(c,”6“); return; } else {No_50=No_50-x_50;} } String str2=”update ATM set NO_50=“+No_50+” where ATM_ID='“+ATM_id+”'“; String str3=”update ATM set NO_100=“+No_100+” where ATM_ID='“+ATM_id+”'“;d.executeUpdate(str2);d.executeUpdate(str3); setmoney(fetchmoney,IC_Number); t12.setText(Float.toString(fetchmoney));cl.show(c,”7“); text2.setText(”"); ATM取款機(jī)課程設(shè)計報告 姓 名: 學(xué) 號: 專 業(yè): 班 級: ATM取款機(jī) 課程設(shè)計過程概述 2009年6月,JAVA游戲開發(fā)課程設(shè)計在實驗樓三樓機(jī)房進(jìn)行,持續(xù)時間為兩周。這次課程設(shè)計的主要目的是結(jié)合面向?qū)ο蟪绦蛟O(shè)計課程,培養(yǎng)我們面向?qū)ο筌浖_發(fā)的思維,初步了解軟件開發(fā)的一般流程,提高用JAVA編程的實際動手能力并增強(qiáng)大家對面向?qū)ο蟮牧私狻_@次課程設(shè)計的主要內(nèi)容是獨立用JAVA語言開發(fā)一個小的應(yīng)用程序。我開發(fā)了一個ATM柜員機(jī)。課程設(shè)計題目描述和基本設(shè)計要求 我設(shè)計的ATM柜員機(jī)主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務(wù)、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機(jī)的要求。系統(tǒng)需求分析 3.1 功能需求分析 本ATM柜員機(jī)的主要功能如下所述: 要求使用圖形用戶界面。當(dāng)輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統(tǒng)能登錄ATM柜員機(jī)系統(tǒng),用戶可以按照以下規(guī)則進(jìn)行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數(shù),總額不超過5000元,支取金額不允許透支。 ? ATM存款:不能出現(xiàn)負(fù)存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。3.2 其他需求分析 (1)性能描述 實時性好、靈活性強(qiáng)、易于不同年齡階段的人操作。(2)設(shè)計約束 開發(fā)工具:JCrator ProV3.5.0 運(yùn)行環(huán)境:Windows 2000以上 能實現(xiàn)用戶所定義的各項需求。(3)界面要求 以Windows窗口形式顯示,標(biāo)題欄為ATM柜員機(jī)名稱,右上角有最小化按鈕、最大化按鈕、關(guān)閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。系統(tǒng)設(shè)計 4.1 總體設(shè)計 我所設(shè)計的ATM柜員機(jī)主要是由登錄頁面模塊還由選擇服務(wù)模塊組成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結(jié)構(gòu)圖如下所示: 圖1 ATM功能結(jié)構(gòu)示意圖 4.2 ATM柜員機(jī)界面設(shè)計 我覺得一個系統(tǒng)的界面應(yīng)該要簡單明了,當(dāng)然樣式美觀就更好了。我設(shè)計的界面主要是由窗體組成,操作簡單。而每一個窗口則執(zhí)行相應(yīng)的功能。 一個系統(tǒng)界面的好壞直接影響到用戶的操作,界面設(shè)計要求樣式美觀、簡單明了、方便易操作。我設(shè)計的界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執(zhí)行相應(yīng)的操作。 (1)窗體的設(shè)計 窗體整個框架使用Frame類構(gòu)造,F(xiàn)rame有自己的外邊框和自己的標(biāo)題,創(chuàng)建Frame時可以指定其窗口標(biāo)題,我創(chuàng)建的窗口標(biāo)題是各個不同功能的模塊的名字,比如說查詢余額,還有取款等。相應(yīng)源代碼為:WindowBox(String s,Account act){super(“ATM柜員機(jī)”);}、Selection(String s,Account act){ } 向Frame窗口中添加組件使用add()。super(s); 例如:button1 = new Button(“存款”); p1.add(button1);this.add(p1);每個Frame在其右上角都有三個控制圖標(biāo),分別代表將窗口最小化、窗口最大化和關(guān)閉的操作,其中最小化和最大化操作Frame可自動完成,而關(guān)閉窗口操作實現(xiàn)需要書寫有關(guān)的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應(yīng),調(diào)用dispose()方法關(guān)閉窗口。Frame也可以引發(fā)WindowsEvent類代表的窗口事件。相應(yīng)源代碼為: addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關(guān)閉事件 { System.exit(0);} });}(2)窗體的主要結(jié)構(gòu)的設(shè)計 我所設(shè)計的窗口的主要結(jié)構(gòu)的特點就是每個窗口都對應(yīng)著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務(wù)等,所以它們都是由各種按鈕和文本框,標(biāo)簽組成的,而聯(lián)系各個窗體成為一個整體的就是各個按鈕的監(jiān)聽事件。所以整個設(shè)計就趨向簡單化了。 為了定義各個按鈕所對應(yīng)的命令和操作,首先需要將各個按鈕注冊給實現(xiàn)了動作事件的監(jiān)聽接口ActionListener的監(jiān)聽者,然后為監(jiān)聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調(diào)用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。 4.3 各功能模塊設(shè)計 4.3.1 登陸頁面模塊設(shè)計 與ATM柜員機(jī)打交道比較多的,也是大家對安全比較關(guān)心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續(xù)服務(wù)。 我定義了文本框累的對象tf1,tf2。抓藥是用于輸入單行的文本;文本區(qū)調(diào)用public String getText()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關(guān)掉窗口。此模塊相應(yīng)的部分源代碼為: public void actionPerformed(ActionEvent e){ Account act;String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*選擇各種服務(wù)*/ if(e.getSource()== button1){ String number1,number2; number1=tf1.getText(); number2=tf2.getText();/*判斷密碼和卡號是否正確*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){ dispose(); /*卡號和密碼都正確則進(jìn)入功能選擇窗口*/ } Selection s = new Selection(“選擇服務(wù)”,act); }else{ } dispose(); ErrorWarn ew = new ErrorWarn(“消息!”,act); /*退卡*/ if(e.getSource()==button2){ } System.exit(0);dispose();} 4.3.2 選擇服務(wù)模塊設(shè)計 在選擇服務(wù)模塊中,有各種ATM的服務(wù)功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應(yīng)的界面。每一個按鈕都有監(jiān)聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創(chuàng)建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數(shù)e,監(jiān)視器就會知道所發(fā)生的事件,對此事件進(jìn)行處理。其中的部分源代碼為: p.add(new Label(“請選擇你要的服務(wù)”)); this.add(p);button1 = new Button(“存款”);p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查詢余額”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密碼”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);//setLayout(new GridLayout());setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ if(e.getSource()==button2){//取款 } if(e.getSource()==button3){//查詢余額 } else if(e.getSource()==button4){//退出 } else if(e.getSource()==button5){//修改密碼 ChangePassword cp = new ChangePassword(“修改密碼”,act);dispose(); dispose();GetBalance gb = new GetBalance(“取款”,act); Query q =new Query(“查詢余額”,act);dispose();System.exit(0);dispose(); } } } 4.3.3 取款模塊設(shè)計 在取款模塊中,和其他的界面也是同樣的結(jié)構(gòu)。也是有一個文本框和一個按鈕還有標(biāo)簽組成的。用戶在文本框中輸入他想取的數(shù)額,但是必須是100的倍數(shù),而且每一次最多只能取5000塊。當(dāng)然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負(fù),否則就會彈出報錯的窗口。其方法為: if(e.getSource()==button){ /*判斷余額是否為負(fù)*/ if(act.get_Money()<0){ } dispose(); ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act); /*判斷取款數(shù)額是否小于卡里余額*/ else if(money<=act.get_Money()){ /*取款的數(shù)額必須是100的倍數(shù)且每次最多只能取5000塊*/ if((money%100!=0)||(money>=5000)){ } act.set_Balance(money);//重新設(shè)置卡里的余額 this.setVisible(false); dispose(); ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act); /*取款后就再次進(jìn)入選擇界面*/ Selection s = new Selection(“選擇服務(wù)”,act); //dispose();}else if(money>act.get_Money()){ } } dispose(); ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act);4.3.4 修改密碼模塊設(shè)計 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會報錯。再一個就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會報錯,然后再重新回到修改密碼的界面。在修改密碼時用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(act.get_Password())){ /*判斷兩次輸入的密碼是否匹配*/ if(pwd3.equals(pwd4)){ /*如果都正確的話就設(shè)置新密碼*/ act.setPassword(pwd3);dispose();Selection s = new Selection(“選擇”,act); }else{ dispose();} ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{ this.setVisible(false); } ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act); dispose(); 4.3.5 退卡模塊設(shè)計 在退卡模塊設(shè)計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==button4){//退出 } System.exit(0);dispose();這個方法就可以實現(xiàn)了,這里就不再多說了。 4.4 異常處理情況說明 (1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數(shù)據(jù)庫訪問時的異常處理 需要處理的異常:SQLException(3)加載類時的異常處理 需要處理的異常:ClassNotFindException,當(dāng)應(yīng)用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。 (4)加載URL時的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現(xiàn)了錯誤的 URL。或者在規(guī)范字符串中找不到任何合法協(xié)議,或者無法分析字符串。系統(tǒng)實現(xiàn)與測試 (1)打開DOS,編譯運(yùn)行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報右下圖的錯誤。 圖2 主界面—登陸頁面 (2)選擇服務(wù)界面效果 當(dāng)輸入的密碼和卡號正確,單擊確定后就會進(jìn)入到選擇服務(wù)的界面,如圖3所示。然后就可以選擇所需要的服務(wù)了。 圖3 選擇服務(wù)界面 (3)取款界面,如圖4所示。 圖4 取款界面 當(dāng)輸入的錢數(shù)不是100的倍數(shù)或每一次大于5000時就會報圖5的錯誤。 圖5 輸入錯誤1 當(dāng)取款時如果超過卡里的余額的話就會報圖6的錯誤。 圖6 輸入錯誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 經(jīng)過測試,所有的功能基本上都實現(xiàn)了,而且運(yùn)行正常。課程設(shè)計總結(jié) 6.1 遇到的問題及解決辦法 在此次課程設(shè)計中,我遇到了一些問題,如:對于面向?qū)ο蟮姆椒私獠粔蛲笍兀\(yùn)用到實際的軟件開發(fā)中存在著困難;對于Java語言,只學(xué)習(xí)到了一些最基本的知識,這導(dǎo)致編寫程序時經(jīng)常出現(xiàn)一些語法錯誤,而且要在短時間內(nèi)用Java語言來設(shè)計一個具 體的系統(tǒng)是一個較大的挑戰(zhàn);還有對于正規(guī)開發(fā)一個系統(tǒng)的流程不熟悉,適應(yīng)起來比較慢,編寫各個模塊相對應(yīng)的操作時,自己感覺難以動手,這表明所學(xué)的知識不能靈活運(yùn)用到實際中。 對于以上的問題,自己有清楚的認(rèn)識,解決辦法是需要大量閱讀相關(guān)的書籍,對于書上以及網(wǎng)站上下載的資料中的Java實例必須有清楚的理解,還有就是多跟精通此方面的老師和同學(xué)交流,取其精華。對于實際動手能力與系統(tǒng)開發(fā)的流程的適應(yīng),必須多進(jìn)行實際的練習(xí)與操作,才能有大的進(jìn)步。 6.2 心得體會 在這次的學(xué)課程設(shè)計中,我主要運(yùn)用了Java語言的界面設(shè)計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運(yùn)用了Java語言。我深刻感受到了面向?qū)ο笳Z言中類庫的強(qiáng)大功能,掌握了運(yùn)用Java中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,為以后的面向?qū)ο笳Z言的自學(xué)奠定了基礎(chǔ)。 通過這兩個禮拜的課程設(shè)計我真的學(xué)到了很多的東西,當(dāng)然這也和我的同學(xué)的幫助是離不開的。好了,下面就談一下我在這些天的體會吧: 在這次的課程設(shè)計中,主要是運(yùn)用JAVA語言來編寫一個小的應(yīng)用程序,當(dāng)然還可以用其他的技術(shù)來輔助了。在這個小應(yīng)用程序當(dāng)中,我用了Java外還用了Swing控件。輸入輸出流等技術(shù)。由于以前學(xué)的不是很扎實,而且還有些知識我們都是沒有學(xué)過的,這就要求我們?nèi)ゲ橄嚓P(guān)的書籍,還有就是和同學(xué)之間的交流。正因為這樣,才鍛煉了我的自學(xué)的能力,還有就是加深了我對各個知識點的認(rèn)識,并且提高了我對專業(yè)的學(xué)習(xí)的興趣,為我以后的學(xué)習(xí)打下了基礎(chǔ)。此外,我還感受到了面向?qū)ο笳Z言的類庫的強(qiáng)大的功能,掌握了運(yùn)用JAVA中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,也就是要會用API文檔,為以后更好的學(xué)習(xí)面向?qū)ο笳Z言奠定了基礎(chǔ)。 通過將近兩周的努力,這次課程設(shè)計終于結(jié)束了,在這個過程當(dāng)中,我學(xué)到了很多的知識,同時也感謝我的同學(xué)的幫助和指導(dǎo)。在以后的學(xué)習(xí)當(dāng)中,我會更加努力的學(xué)習(xí)好專業(yè)知識,并將所學(xué)的知識用于實踐當(dāng)中去,以便牢固掌握知識。 參考文獻(xiàn) [1] 王萌,劉婧,來賓著.JAVA程序設(shè)計[M]北京 冶金工業(yè)出版社,2004 [2] 黃聰明 精通 JAVA2程序設(shè)計[M]北京:清華大學(xué)出版社,2004.4 [3] 王文濤,袁海燕 JAVA實用程序設(shè)計100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設(shè)計[M]北京:清華大學(xué)出版社,2006.8 [5] 劉寶林 JAVA程序設(shè)計與案例[M]北京:高等教育出版社,2006.11 附錄 import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;import java.io.*; /*登陸頁面首窗口*/ class WindowBox extends Frame implements ActionListener{ Box baseBox,box1,box2;TextField tf1,tf2;Button button1;Button button2;WindowBox(String s){//構(gòu)造方法 super(s); tf1 = new TextField(6); tf2 = new TextField(6); box1= Box.createVerticalBox;box1.add(new Label(“請輸入你的卡號”));//輸入卡號 box1.add(Box.createVerticalStrut(8));box1.add(new Label(“請輸入你的密碼”));//輸入密碼 } box2=Box.createVerticalBox();box2.add(tf1);//box2.add(new TextField(16));box2.add(Box.createVerticalStrut(8));box2.add(tf2);//box2.add(new TextField(16));baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(“確定”);//加入按鈕 button1.addActionListener(this);add(button1); button2 = new Button(“退卡”);//退卡按鈕 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*監(jiān)聽器*/ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ });System.exit(0);} setBounds(120,125,200,175);setVisible(true); public void actionPerformed(ActionEvent e){ Account act;String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*選擇各種服務(wù)*/ if(e.getSource()== button1){ String number1,number2;//輸入的兩個卡號和密碼的變量 number1=tf1.getText(); number2=tf2.getText(); /*判斷兩次輸入的卡號和密碼是否正確*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){ dispose(); Selection s = new Selection(“選擇服務(wù)”,act); }else{ dispose(); ErrorWarn ew = new ErrorWarn(“消息!”,act);//報輸入密碼或卡號不正確 } } /*主函數(shù)*/ class ATM{ } } if(e.getSource()==button2){ } System.exit(0);dispose();//退出 } public static void main(String [] args){ } new WindowBox(“登錄頁面”);/*選擇服務(wù)*/ import java.awt.*;import java.awt.event.*;class Selection extends Frame implements ActionListener{ Button button1,button2,button3,button4,button5;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act; public Selection(){} Selection(String s,Account act){ super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(“請選擇你要的服務(wù)”));this.add(p); /*各種服務(wù)功能*/ button1 = new Button(“存款”); } p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查詢余額”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密碼”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ });System.exit(0);} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ } } if(e.getSource()==button2){//取款 } if(e.getSource()==button3){//查詢余額 } else if(e.getSource()==button4){//退出 } else if(e.getSource()==button5){//修改密碼 } ChangePassword cp = new ChangePassword(“修改密碼”,act);dispose();System.exit(0);dispose();Query q =new Query(“查詢余額”,act);dispose();dispose();GetBalance gb = new GetBalance(“取款”,act); /*class Test4{ public static void main(String [] args){ Selection s = new Selection(“選擇”); /*取款功能*/ import javax.swing.*;import java.awt.*; }*/ } import javax.swing.border.*;import java.awt.event.*;class GetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;GetBalance(String s,Account act){//構(gòu)造函數(shù) super(s);this.act=act;button=new Button(“確定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“請輸入你想取錢的數(shù)目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0);setBounds(200,200,150,150);this.setVisible(true); } public void actionPerformed(ActionEvent e){ 于5000 } //System.out.println(e.getActionCommand());double money; money = Double.parseDouble(tf.getText().trim());if(e.getSource()==button){ if(act.get_Money()<0){//判斷余額是否為負(fù) dispose(); ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act);} else if(money<=act.get_Money()){//取錢的數(shù)額不大于余額 if((money%100!=0)||(money>=5000)){//取錢數(shù)為100的倍數(shù)或不大 dispose(); ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act); } act.set_Balance(money);//重置余額 this.setVisible(false); Selection s = new Selection(“選擇服務(wù)”,act);//返回選擇服務(wù)窗口 //dispose(); }else if(money>act.get_Money()){判斷取款數(shù)額是否大于余額 dispose(); ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act); } } } /* public static void main(String[] args){ } /*修改密碼功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class ChangePassword extends Frame implements ActionListener{ Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();TextField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){ super(s);this.act=act; GetBalance test = new GetBalance(“dfdf”);} GetBalance gb = new GetBalance(“取款”);tf4 = new TextField(6);tf5 = new TextField(6);tf6 = new TextField(6);button = new Button(“確定”); button.addActionListener(this);/*建立新密碼*/ } /*判斷事件源,看條件是否成立再修改密碼*/ public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4; pwd2 = tf4.getText(); panel1.add(new Label(“請輸入你的舊密碼:”));panel1.add(tf4);panel2.add(new Label(“請輸入你的新密碼:”));panel2.add(tf5);panel3.add(new Label(“請再次輸入你的新密碼”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,250,250);this.setVisible(true);/*窗口事件*/ this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0); } } pwd3 = tf5.getText(); pwd4 = tf6.getText(); } if(pwd2.equals(act.get_Password())){//判斷舊密碼是否正確 if(pwd3.equals(pwd4)){//判斷兩次輸入的新密碼是個匹配 act.setPassword(pwd3);//啟用新的密碼 dispose();Selection s = new Selection(“選擇”,act);//返回選擇服務(wù)窗口 }else{ //this.setVisible(true); //ErrorWarn2 ew = new ErrorWarn2(“消息”,act); dispose();} ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{ this.setVisible(false); } ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act); dispose();/*查詢余額功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class Query extends Frame implements ActionListener{ //Account act;Button button;Account act;Query(String s,Account act){//構(gòu)造函數(shù) } public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ dispose(); super(s);this.act = act; button=new Button(“確定”);//TextField tf = new TextField(6);Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(“你的余額為: ” + act.get_Money()));//查詢余額的方法 //panel1.add(tf); button.addActionListener(this);panel.add(button);this.add(panel);this.add(panel1);this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){ });public void windowClosing(WindowEvent e){ } System.exit(0);setBounds(200,200,150,150);setVisible(true); } } Selection s = new Selection(“選擇服務(wù)”,act);//返回選擇服務(wù)窗口 } /*賬戶*/ import java.io.*; /*該類為實現(xiàn)客戶信息及部分功能*/ class Account { private String code =null; //信用卡號 private String name =null; //客戶姓名 private String password=null; //客戶密碼 private double money =0.0; //卡里金額 /********************/ public Account(String code,String name,String password,double money){ this.code=code; this.name=name; this.password=password; this.money=money;} public String get_Code(){//取得卡號 return code;} public String get_Name(){//取得名字 return name;} public String get_Password(){//取得密碼 return password;} public double get_Money(){//取得余額 return money;} /*得到剩余的錢的數(shù)目*/ protected void set_Balance(double mon){ money-= mon;} /*重置秘密的方法*/ public String setPassword(String pwd){ } } password = pwd;return password; 黃 淮 學(xué) 院 JAVA 課程設(shè)計報告 題 目: 《ATM柜員機(jī)》課程設(shè)計 學(xué) 院: 信 息 工 程 學(xué) 院 專 業(yè): 計算機(jī)科學(xué)與技術(shù) 指導(dǎo)老師: 二0一三年六月 目錄 課程設(shè)計過程概述.......................................................................................3 2 課程設(shè)計題目描述和基本設(shè)計要求...........................................................3 3 系統(tǒng)需求分析...............................................................................................3 3.1 功能需求分析···················································································· 3 3.2 其他需求分析···················································································· 4 4 系統(tǒng)設(shè)計........................................................................................................4 4.1 總體設(shè)計 ··························································································· 4 4.2 ATM柜員機(jī)界面設(shè)計 ········································································· 5 4.3 各功能模塊設(shè)計 ················································································ 7 4.3.1 登陸頁面模塊設(shè)計 ····························································· 7 4.3.2 選擇服務(wù)模塊設(shè)計 ····························································· 8 4.3.3 取款模塊設(shè)計 ····································································· 9 4.3.4 修改密碼模塊設(shè)計 ····························································· 9 4.3.5 退卡模塊設(shè)計 ··································································· 10 4.4 異常處理情況說明 ·········································································· 10 5 系統(tǒng)實現(xiàn)與測試.........................................................................................11 6 課程設(shè)計總結(jié).............................................................................................13 6.1 遇到的問題及解決辦法 ·································································· 13 6.2 心得體會 ························································································· 14 參考文獻(xiàn)..........................................................................................................15 附錄..................................................................................................................15 ATM初始賬號:000000 初始密碼:123456 ATM柜員機(jī) 課程設(shè)計過程概述 2013年6月,JAVA課程設(shè)計在1#樓六樓機(jī)房進(jìn)行,持續(xù)時間為兩周。這次課程設(shè)計的主要目的是結(jié)合面向?qū)ο蟪绦蛟O(shè)計課程,培養(yǎng)我們面向?qū)ο筌浖_發(fā)的思維,初步了解軟件開發(fā)的一般流程,提高用JAVA編程的實際動手能力并增強(qiáng)大家對面向?qū)ο蟮牧私狻_@次課程設(shè)計的主要內(nèi)容是獨立用JAVA語言開發(fā)一個小的應(yīng)用程序。我們開發(fā)了一個ATM柜員機(jī)。課程設(shè)計題目描述和基本設(shè)計要求 我設(shè)計的ATM柜員機(jī)主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務(wù)、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機(jī)的要求。3 系統(tǒng)需求分析 3.1 功能需求分析 本ATM柜員機(jī)的主要功能如下所述: 要求使用圖形用戶界面。當(dāng)輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統(tǒng)能登錄ATM柜員機(jī)系統(tǒng),用戶可 以按照以下規(guī)則進(jìn)行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數(shù),總額不超過5000元,支取金額不允許透支。? ATM存款:不能出現(xiàn)負(fù)存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。 3.2 其他需求分析(1)性能描述 實時性好、靈活性強(qiáng)、易于不同年齡階段的人操作。(2)設(shè)計約束 開發(fā)工具:MyEclipse 運(yùn)行環(huán)境:Windows XP、Window 7 能實現(xiàn)用戶所定義的各項需求。(3)界面要求 以Windows窗口形式顯示,標(biāo)題欄為ATM柜員機(jī)名稱,右上角有最小化按鈕、最大化按鈕、關(guān)閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。4 系統(tǒng)設(shè)計 4.1 總體設(shè)計 我所設(shè)計的ATM柜員機(jī)主要是由登錄頁面模塊還由選擇服務(wù)模塊組 成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結(jié)構(gòu)圖如下所示: 圖1 ATM功能結(jié)構(gòu)示意圖 4.2 ATM柜員機(jī)界面設(shè)計 我們覺得一個系統(tǒng)的界面應(yīng)該要簡單明了,當(dāng)然樣式美觀就更好了。我設(shè)計的界面主要是由窗體組成,操作簡單。而每一個窗口則執(zhí)行相應(yīng)的功能。 一個系統(tǒng)界面的好壞直接影響到用戶的操作,界面設(shè)計要求樣式美觀、簡單明了、方便易操作。我設(shè)計的界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執(zhí)行相應(yīng)的操作。(1)窗體的設(shè)計 窗體整個框架使用Frame類構(gòu)造,F(xiàn)rame有自己的外邊框和自己的標(biāo)題,創(chuàng)建Frame時可以指定其窗口標(biāo)題,我創(chuàng)建的窗口標(biāo)題是各個不 同功能的模塊的名字,比如說查詢余額,還有取款等。相應(yīng)源代碼為: 向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”);p1.add(button1);this.add(p1);每個Frame在其右上角都有三個控制圖標(biāo),分別代表將窗口最小化、窗口最大化和關(guān)閉的操作,其中最小化和最大化操作Frame可自動完成,而關(guān)閉窗口操作實現(xiàn)需要書寫有關(guān)的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應(yīng),調(diào)用dispose()方法關(guān)閉窗口。Frame也可以引發(fā)WindowsEvent類代表的窗口事件。相應(yīng)源代碼為: addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關(guān)閉事件 { System.exit(0);} });}(2)窗體的主要結(jié)構(gòu)的設(shè)計 我所設(shè)計的窗口的主要結(jié)構(gòu)的特點就是每個窗口都對應(yīng)著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務(wù)等,所以它們都是由各種按鈕和文本框,標(biāo)簽組成的,而聯(lián)系各個窗體成為一個整體的就是各個按鈕的監(jiān)聽事件。所以整個設(shè)計就趨向簡單化了。 為了定義各個按鈕所對應(yīng)的命令和操作,首先需要將各個按鈕注冊給實現(xiàn)了動作事件的監(jiān)聽接口ActionListener的監(jiān)聽者,然后為監(jiān)聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調(diào)用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。4.3 各功能模塊設(shè)計 4.3.1 登陸頁面模塊設(shè)計 與ATM柜員機(jī)打交道比較多的,也是大家對安全比較關(guān)心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續(xù)服務(wù)。我定義了文本框類的對象tf1,tf2。是用于輸入單行的文本;文本區(qū)調(diào)用public String getPassword()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關(guān)掉窗口。此模塊相應(yīng)的部分源代碼為: public void actionPerformed(ActionEvent e){ Account act;act=new Account(“000000”,“HuangHuai”,“123456”,50000);//初始化 /*選擇各種服務(wù)*/ if(e.getSource()== button1){ String number1,number2;//輸入的兩個卡號和密碼的變量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判斷兩次輸入的卡號和密碼是否正確*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(number2))){ dispose(); new Selection(“選擇服務(wù)”,act);}else{ JOptionPane.showMessageDialog(this, “密碼或帳號錯誤!”,“賬戶提 示信息”,JOptionPane.ERROR_MESSAGE); dispose(); new WindowBox(“ATM”); } } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } 4.3.2 選擇服務(wù)模塊設(shè)計 在選擇服務(wù)模塊中,有各種ATM的服務(wù)功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應(yīng)的界面。每一個按鈕都有監(jiān)聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創(chuàng)建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數(shù)e,監(jiān)視器就會知道所發(fā)生的事件,對此事件進(jìn)行處理。其中的部分源代碼為: p.add(new Label(“請選擇你要的服務(wù)”)); this.add(p);/*各種服務(wù)功能*/ buttonCUN = new Button(“ 存 款 ”); p1.add(buttonCUN); this.add(p1); buttonQU = new Button(“ 取 款 ”); p2.add(buttonQU); this.add(p2); buttonCHA = new Button(“ 查詢余額 ”); p3.add(buttonCHA); this.add(p3); buttonTUI = new Button(“ 退 出 ”); p4.add(buttonTUI); this.add(p4); buttonGAI = new Button(“ 修改密碼 ”); 4.3.3 取款模塊設(shè)計 在取款模塊中,和其他的界面也是同樣的結(jié)構(gòu)。也是有一個文本框和一個按鈕還有標(biāo)簽組成的。用戶在文本框中輸入他想取的數(shù)額,但是必須是100的倍數(shù),而且每一次最多只能取5000塊。當(dāng)然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負(fù),否則就會彈出報錯的窗口。其方法為: public String withdrawMoney(double money){ String str = null; if(money<=0){ str = “取款數(shù)目須是正數(shù)!”;}else{ if(getMoney()<0){//判斷余額是否為負(fù) str=“余額為負(fù)數(shù)!”; }else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取錢數(shù)為100的倍數(shù)或不大于5000 str= “取款數(shù)目須是一百的整數(shù)倍!”; }else{ setBalance(money); str = “取款成功:余額為”+getMoney(); } }else{ str = “余額不足!”; } } return str;} 4.3.4 修改密碼模塊設(shè)計 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會報錯。再一個就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會報錯,然后再重新回到修改密碼的界面。在修改密碼時用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判斷兩次輸入的新密碼是個匹配 act.changePassword(pwd3);//啟用新的密碼 dispose(); JOptionPane.showMessageDialog(this, “修改密碼成功!”); new Selection(“選擇”,act);//返回選擇服務(wù)窗口 }else{ this.setVisible(true); dispose(); JOptionPane.showMessageDialog(this, “兩次輸入要修改的密碼不同,更新密碼失敗!”); new Selection(“選擇”,act); } }else{ this.setVisible(false); dispose(); JOptionPane.showMessageDialog(this, “輸入密碼錯誤,更新密碼失敗!”); new Selection(“選擇”,act);} } 4.3.5 退卡模塊設(shè)計 在退卡模塊設(shè)計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==buttonTUI){//退出 System.exit(0); dispose(); } 這個方法就可以實現(xiàn)了,這里就不再多說了。4.4 異常處理情況說明 (1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數(shù)據(jù)庫訪問時的異常處理 需要處理的異常:SQLException (3)加載類時的異常處理 需要處理的異常:ClassNotFindException,當(dāng)應(yīng)用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。(4)加載URL時的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現(xiàn)了錯誤的 URL。或者在規(guī)范字符串中找不到任何合法協(xié)議,或者無法分析字符串。5 系統(tǒng)實現(xiàn)與測試 (1)打開MyEclipse,編譯運(yùn)行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報下圖的錯誤。 圖2 主界面—登陸頁面 (2)選擇服務(wù)界面效果 當(dāng)輸入的密碼和卡號正確,單擊確定后就會進(jìn)入到選擇服務(wù)的界面,如圖3所示。然后就可以選擇所需要的服務(wù)了。 圖3 選擇服務(wù)界面 (3)取款界面,如圖4所示。 圖4 取款界面 當(dāng)輸入的錢數(shù)不是100的倍數(shù)或每一次大于5000時就會報圖5的錯誤。 圖5 輸入錯誤 當(dāng)取款時如果超過卡里的余額的話就會報圖6的錯誤。 圖6 輸入錯誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 (5)修改密碼界面,如下圖所示。 經(jīng)過測試,所有的功能基本上都實現(xiàn)了,而且運(yùn)行正常。6 課程設(shè)計總結(jié) 6.1 遇到的問題及解決辦法 在此次課程設(shè)計中,我遇到了一些問題,如:對于面向?qū)ο蟮姆椒私獠粔蛲笍兀\(yùn)用到實際的軟件開發(fā)中存在著困難;對于Java語言,只學(xué)習(xí)到了一些最基本的知識,這導(dǎo)致編寫程序時經(jīng)常出現(xiàn)一些語法錯誤,而且要在短時間內(nèi)用Java語言來設(shè)計一個具體的系統(tǒng)是一個較大的挑戰(zhàn);還有對于正規(guī)開發(fā)一個系統(tǒng)的流程不熟悉,適應(yīng)起來比 較慢,編寫各個模塊相對應(yīng)的操作時,自己感覺難以動手,這表明所學(xué)的知識不能靈活運(yùn)用到實際中。 對于以上的問題,自己有清楚的認(rèn)識,解決辦法是需要大量閱讀相關(guān)的書籍,對于書上以及網(wǎng)站上下載的資料中的Java實例必須有清楚的理解,還有就是多跟精通此方面的老師和同學(xué)交流,取其精華。對于實際動手能力與系統(tǒng)開發(fā)的流程的適應(yīng),必須多進(jìn)行實際的練習(xí)與操作,才能有大的進(jìn)步。6.2 心得體會 在這次的學(xué)課程設(shè)計中,我主要運(yùn)用了Java語言的界面設(shè)計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運(yùn)用了Java語言。我深刻感受到了面向?qū)ο笳Z言中類庫的強(qiáng)大功能,掌握了運(yùn)用Java中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,為以后的面向?qū)ο笳Z言的自學(xué)奠定了基礎(chǔ)。 通過這兩個禮拜的課程設(shè)計我真的學(xué)到了很多的東西,當(dāng)然這也和我的同學(xué)的幫助是離不開的。好了,下面就談一下我在這些天的體會吧: 在這次的課程設(shè)計中,主要是運(yùn)用JAVA語言來編寫一個小的應(yīng)用程序,當(dāng)然還可以用其他的技術(shù)來輔助了。在這個小應(yīng)用程序當(dāng)中,我用了Java外還用了Swing控件。輸入輸出流等技術(shù)。由于以前學(xué)的不是很扎實,而且還有些知識我們都是沒有學(xué)過的,這就要求我們?nèi)ゲ橄嚓P(guān)的書籍,還有就是和同學(xué)之間的交流。正因為這樣,才鍛煉了我的自學(xué)的能力,還有就是加深了我對各個知識點的認(rèn)識,并且提高了我對專業(yè)的學(xué)習(xí)的興趣,為我以后的學(xué)習(xí)打下了基礎(chǔ)。此外,我還 感受到了面向?qū)ο笳Z言的類庫的強(qiáng)大的功能,掌握了運(yùn)用JAVA中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,也就是要會用API文檔,為以后更好的學(xué)習(xí)面向?qū)ο笳Z言奠定了基礎(chǔ)。通過將近兩周的努力,這次課程設(shè)計終于結(jié)束了,在這個過程當(dāng)中,我學(xué)到了很多的知識,同時也感謝我的同學(xué)的幫助和指導(dǎo)。在以后的學(xué)習(xí)當(dāng)中,我會更加努力的學(xué)習(xí)好專業(yè)知識,并將所學(xué)的知識用于實踐當(dāng)中去,以便牢固掌握知識。參考文獻(xiàn) [1] 王萌,劉婧,來賓著.JAVA程序設(shè)計[M]北京 冶金工業(yè)出版社,2004 [2] 黃聰明 精通 JAVA2程序設(shè)計[M]北京:清華大學(xué)出版社,2004.4 [3] 王文濤,袁海燕 JAVA實用程序設(shè)計100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設(shè)計[M]北京:清華大學(xué)出版社,2006.8 [5] 劉寶林 JAVA程序設(shè)計與案例[M]北京:高等教育出版社,2006.11 附錄 Account類: package cn.com.account;/** * 帳戶 * 該類為實現(xiàn)客戶信息及部分功能 */ public class Account { private String code = null;//信用卡號 private String name = null;//客戶姓名 private String password= null;//客戶密碼 private double money = 0.0;//卡里金額 public Account(){ } public Account(String code,String name,String password,double money){ } public String getCode(){//取得卡號 return code;} public String getName(){//取得名字 return name;} /** * 取得密碼 * @return */ public String getPassword(){ } /** * 重置秘密的方法 */ public void changePassword(String pwd){ } public double getMoney(){//取得余額 return money;} /** * 得到剩余的錢的數(shù)目 */ private void setBalance(double mon){ } money-= mon;password = pwd;return password;this.code=code;this.name=name;this.password=password;this.money=money;this.code = “123456”;this.password = “123456”; } /** * 取款設(shè)置 * 若成功顯示余額 * 不成功顯示提示信息 */ public String withdrawMoney(double money){ String str = null;if(money<=0){ str = “取款數(shù)目須是正數(shù)!”;}else{ if(getMoney()<0){//判斷余額是否為負(fù) str=“余額為負(fù)數(shù)!”;}else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取錢數(shù)為100的倍數(shù) str= “取款數(shù)目須是一百的整數(shù)倍!”;}else{ setBalance(money);str = “取款成功:余額為”+getMoney();} 或不大于5000 }else{ str = “余額不足!”;} } return str;} /** * 存款設(shè)置 * 若成功顯示余額 * 不成功顯示提示信息 */ public String depositMoney(double money){ } String str = null; if(money<0){ str =“存款數(shù)目須是正數(shù)!”;}else{ setBalance(-money);str = “存款成功:余額為”+getMoney();} return str;ChangePassword類: package cn.com.frameui;import cn.com.account.Account;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class ChangePassword extends Frame implements ActionListener{ Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();//TextField tf4,tf5,tf6;JPasswordField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){ super(s);this.act=act; tf4 = new JPasswordField(6);tf5 = new JPasswordField(6);tf6 = new JPasswordField(6);button = new Button(“確定”);button.addActionListener(this);/*建立新密碼*/ panel1.add(new Label(“請輸入你的舊密碼:”));panel1.add(tf4);panel2.add(new Label(“請輸入你的新密碼:”));panel2.add(tf5);panel3.add(new Label(“請再次輸入新密碼:”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,300,200);this.setVisible(true);/** * 窗口事件, 判斷窗口是否關(guān)閉 */ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } } });/** * 判斷事件源,看條件是否成立再修改密碼 */ public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4,pwd1;char [] p2,p3,p4;pwd1 = act.getPassword();p2=tf4.getPassword();p3=tf5.getPassword();p4=tf6.getPassword(); pwd2 = new String(p2);pwd3 = new String(p3);pwd4 = new String(p4); if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判斷兩次輸入的新密碼是個匹配 act.changePassword(pwd3);//啟用新的密碼 dispose();JOptionPane.showMessageDialog(this, “修改密碼成功!”);new Selection(“選擇”,act);//返回選擇服務(wù)窗口 }else{ this.setVisible(true);dispose();JOptionPane.showMessageDialog(this, “兩次輸入要修改的密碼不同, new Selection(”選擇“,act);} this.setVisible(false);dispose();JOptionPane.showMessageDialog(this, ”輸入密碼錯誤,更新密碼失更新密碼失敗!“);}else{ 敗!”); new Selection(“選擇”,act);} } } GetBalance類: package cn.com.frameui;import cn.com.account.*;import javax.swing.*; import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class GetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;public GetBalance(String s,Account act){//構(gòu)造函數(shù) super(s); } public void actionPerformed(ActionEvent e){ double money;String str = null;/* * 取款判定 */ this.act=act;button=new Button(“確定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“請輸入你想取錢的數(shù)目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } System.exit(0);});setBounds(200,200,300,200);this.setVisible(true); if(tf.getText().toString().equals(“")){ str = ”取款數(shù)目不能為空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.withdrawMoney(money); JOptionPane.showMessageDialog(this, str,”取款提示信息“,JOptionPane.PLAIN_MESSAGE); } this.setVisible(false);new Selection(”選擇服務(wù)“,act);} Query類: package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Query extends Frame implements ActionListener{ Button button;Account act;public Query(String s,Account act){//構(gòu)造函數(shù) super(s); this.act = act; button=new Button(”確定“); Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(”你的余額為: “ + act.getMoney()));//查詢余額的方法 this.add(panel1);this.add(panel); button.addActionListener(this);panel.add(button); this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } } } System.exit(0);});setBounds(200,200,200,150);setVisible(true);public void actionPerformed(ActionEvent e){ } if(e.getSource()==button){ dispose();new Selection(”選擇服務(wù)“,act);//返回選擇服務(wù)窗口 } Selection類: package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Selection extends Frame implements ActionListener{ Button buttonCUN,buttonQU,buttonCHA,buttonTUI,buttonGAI;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act; public Selection(){} public Selection(String s,Account act){ super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(”請選擇你要的服務(wù)“));this.add(p);buttonCUN = new Button(” 存 款 “);p1.add(buttonCUN);this.add(p1);buttonQU = new Button(” 取 款 “);p2.add(buttonQU);/*各種服務(wù)功能*/ } this.add(p2);buttonCHA = new Button(” 查詢余額 “);p3.add(buttonCHA);this.add(p3);buttonTUI = new Button(” 退 出 “);p4.add(buttonTUI);this.add(p4);buttonGAI = new Button(” 修改密碼 “);p5.add(buttonGAI);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });buttonCUN.addActionListener(this);buttonQU.addActionListener(this);buttonCHA.addActionListener(this);buttonTUI.addActionListener(this);buttonGAI.addActionListener(this);setBounds(150,150,300,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){ if(e.getSource()==buttonCUN){//存款 dispose();new SetBalance(”存款款“,act); }else if(e.getSource()==buttonQU){//取款 dispose();new GetBalance(”取款“,act); }else if(e.getSource()==buttonCHA){//查詢余額 dispose();new Query(”查詢余額“,act); }else if(e.getSource()==buttonTUI){//退出 System.exit(0);dispose(); } } }else if(e.getSource()==buttonGAI){//修改密碼 dispose();new ChangePassword(”修改密碼“,act); } SetBalance類: package cn.com.frameui;import cn.com.account.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class SetBalance extends Frame implements ActionListener{ Box baseBox, box1,box2;Button button;TextField tf;Account act;public SetBalance(String s,Account act){//構(gòu)造函數(shù) super(s); } public void actionPerformed(ActionEvent e){ this.act=act;button=new Button(”確定“);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(”請輸入你想存款的數(shù)目“));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ } System.exit(0);});setBounds(200,200,300,200);this.setVisible(true); double money;String str = null;if(tf.getText().toString().equals(”“)){ str = ”存款數(shù)目不能為空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.depositMoney(money); JOptionPane.showMessageDialog(this, str,”存款提示信息“,JOptionPane.INFORMATION_MESSAGE); } dispose();this.setVisible(false);new Selection(”選擇服務(wù)“,act);} WindowBox類: package cn.com.frameui;import cn.com.account.Account;import javax.swing.*; import java.awt.*;import java.awt.event.*;/** * 登陸頁面首窗口 */ @SuppressWarnings(”serial“)public class WindowBox extends Frame implements ActionListener{ box1= Box.createVerticalBox();box1.add(new Label(”請輸入您的卡號“));//輸入卡號 box1.add(Box.createVerticalStrut(8));box1.add(new Label(”請輸入您的密碼“));//輸入密碼 box2=Box.createVerticalBox();Box baseBox,box1,box2;TextField tf1;JPasswordField tf2;Button button1;Button button2;public WindowBox(String s){//構(gòu)造方法 super(s);tf1 = new TextField(6);tf2 = new JPasswordField(6); } box2.add(tf1); box2.add(Box.createVerticalStrut(8));box2.add(tf2); baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(”確定“);//加入按鈕 button1.addActionListener(this);add(button1); button2 = new Button(”退卡“);//退卡按鈕 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*監(jiān)聽器*/ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(120,125,300,200);setVisible(true);public void actionPerformed(ActionEvent e){ Account act;act=new Account(”000000“,”HuangHuai“,”123456“,50000);//初始化 /*選擇各種服務(wù)*/ if(e.getSource()== button1){ String number1,number2;//輸入的兩個卡號和密碼的變量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判斷兩次輸入的卡號和密碼是否正確*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(num dispose();ber2))){ new Selection(”選擇服務(wù)“,act);}else{ JOptionPane.showMessageDialog(this, ”密碼或帳號錯誤!“,”賬戶提示信息“,JOptionPane.ERROR_MESSAGE);dispose(); new WindowBox(”ATM“);} } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } } package cn.com.test;import cn.com.frameui.*;public class ATM { /** * 主測試程序 * @param args */ public static void main(String[] args){ new WindowBox(”ATM");} } ATM自動取款機(jī)系統(tǒng) ATM自動取款機(jī)(automatic teller machine)是銀行在銀行營業(yè)大廳、超市、商業(yè)機(jī)構(gòu)、機(jī)場、車站、碼頭和鬧市區(qū)設(shè)置的一種小型機(jī)器,利用一張信用卡大小的膠卡上的磁帶〔或芯片卡上的芯片〕記錄客戶的基本戶口資料,讓客戶可以透過機(jī)器進(jìn)行提款、存款、轉(zhuǎn)帳等銀行柜臺服務(wù)。這里介紹使用Rational Rose工具為ATM自動取款機(jī)系統(tǒng)進(jìn)行建模。 5.1需求分析 ATM自動取款機(jī)系統(tǒng)的需求分析簡述如下: (1)客戶將銀行卡插入讀卡器,讀卡器識別卡的真?zhèn)危⒃陲@示器上提示輸入密碼。(2)客戶通過鍵盤輸入密碼,取款機(jī)驗證密碼是否有效。如果密碼錯誤提示錯誤信息,如果正確,提示客戶進(jìn)行選擇操作的業(yè)務(wù)。 (3)客戶根據(jù)自己的需要可進(jìn)行存款、取款、查詢賬戶、轉(zhuǎn)賬、修改密碼的操作。(4)在客戶選擇后顯示器進(jìn)行交互提示和操作確認(rèn)等信息。(5)操作完畢后,客戶可自由選擇打印或不打印憑條。 (6)銀行職員可進(jìn)行對ATM自動取款機(jī)的硬件維護(hù)和添加現(xiàn)金的操作。 5.2系統(tǒng)建模 在系統(tǒng)建模以前,我們首先需要在Rational Rose 2003中創(chuàng)建一個模型。并命名為“ATM自動取款機(jī)系統(tǒng)”,該名稱將會在Rational Rose 2003的頂端出現(xiàn),如下圖5-1所示。 圖 5-1創(chuàng)建項目系統(tǒng)模型 5.2.1創(chuàng)建系統(tǒng)用例模型 創(chuàng)建系統(tǒng)用例的第一步是確定系統(tǒng)的參與者。考試成績管理系統(tǒng)的參與者包含以下三種: (1)客戶(2)銀行職員(3)信用系統(tǒng) 三個參與者如圖5-2所示。 圖5-2 系統(tǒng)參與者 然后,我們根據(jù)參與者的不同分別畫出各個參與者的用例圖。 1.客戶用例圖:客戶在本系統(tǒng)中可以進(jìn)行取款、存款、轉(zhuǎn)賬、查詢余額、修改密碼和還款的相關(guān)操作,通過這些活動創(chuàng)建的客戶用例圖如圖5-3所示。 圖5-3 客戶用例圖 圖5-4 銀行職員用例圖 2.銀行職員用例圖:銀行職員在本系統(tǒng)中能夠進(jìn)行硬件維護(hù)、修改密碼和添加現(xiàn)金的相關(guān)操作,通過這些活動創(chuàng)建的銀行職員用例圖如圖5-4所示。 5.2.2創(chuàng)建系統(tǒng)靜態(tài)模型 從前面的需求分析中,我們可以依據(jù)主要的九個類對象:ATM自動提款機(jī)、客戶、銀行職員、信用系統(tǒng)、數(shù)據(jù)庫連接、銀行賬戶、ATM屏幕、ATM鍵盤和ATM讀卡器創(chuàng)建完整的類圖如圖5-5所示。 圖 5-5 系統(tǒng)類圖 5.2.3創(chuàng)建系統(tǒng)動態(tài)模型 系統(tǒng)的動態(tài)模型可以使用交互作用圖、狀態(tài)圖和活動圖來進(jìn)行描述。 5.2.3.1 創(chuàng)建序列圖和協(xié)作圖 客戶取款的活動步驟分為:(1)客戶插入銀行卡(2)讀卡機(jī)讀取卡號(3)初始化屏幕(4)讀卡機(jī)打開賬戶并提示輸入密碼(5)用戶輸入密碼(6)驗證密碼(7)屏幕提示選擇操作(8)用戶選擇取款操作(9)銀行賬戶扣除錢款(10)吐錢機(jī)提供錢和收據(jù)(11)用戶取錢并退卡。根據(jù)以上步驟創(chuàng)建的序列圖和協(xié)助圖,如下圖5-6和圖5-7所示。 圖5-6 客戶取款序列圖 圖5-7 客戶取款協(xié)作圖 5.2.3.2 創(chuàng)建活動圖 我們還可以利用系統(tǒng)的活動圖來描述系統(tǒng)的參與者是如何協(xié)同工作的。ATM自動取款機(jī)系統(tǒng)中,根據(jù)用戶開立新賬戶的步驟,我們可以創(chuàng)建活動圖如下圖5-12所示。 圖5-12 系統(tǒng)活動圖 圖5-13 系統(tǒng)狀態(tài)圖 5.2.3.3 創(chuàng)建狀態(tài)圖 在ATM自動取款機(jī)系統(tǒng)中,有明確狀態(tài)轉(zhuǎn)換的類是銀行賬戶,從賬戶的打開到賬戶關(guān)閉的過程,狀態(tài)會發(fā)生明顯的變化。創(chuàng)建后的系統(tǒng)狀態(tài)圖如下圖5-13所示。 5.2.4創(chuàng)建系統(tǒng)部署模型 對系統(tǒng)的實現(xiàn)結(jié)構(gòu)進(jìn)行建模的方式包括兩種,即構(gòu)件圖和部署圖。ATM自動取款系統(tǒng)的構(gòu)件圖我們通過構(gòu)件映射到系統(tǒng)的實現(xiàn)類中,說明該構(gòu)件物理實現(xiàn)的邏輯類,在本系統(tǒng)中,我們可以對銀行賬戶、信用系統(tǒng)、客戶、ATM屏幕、ATM取款機(jī)、ATM鍵盤、銀行職員、讀卡器和數(shù)據(jù)庫服務(wù)器分別創(chuàng)建對應(yīng)的構(gòu)件進(jìn)行映射。ATM自動取款機(jī)系統(tǒng)的構(gòu)件圖如圖5-14所示。 .圖 5-14系統(tǒng)構(gòu)件圖 圖5-15 系統(tǒng)部署圖 ATM自動取款機(jī)系統(tǒng)的部署圖描繪的是系統(tǒng)節(jié)點上運(yùn)行資源的安排。包括了四個節(jié)點,分別是:ATM客戶端、地區(qū)ATM服務(wù)器、銀行數(shù)據(jù)庫服務(wù)器和打印機(jī)。創(chuàng)建后的部署圖如圖5-15所示。 錯把自己的錢存到別人卡里怎么辦 看著銀行ATM自助取款機(jī)的屏幕上,顯示著有一筆5000元的現(xiàn)金入賬。租住在金花路某小區(qū)的馮國光長長地舒了一口氣,這件事總算解決了,7個月來,我也終于可以睡個踏實覺了。他高興地說: 這件事還要從今年5月份的一天說起:那天下午馮國光來到某銀行金花路支行的柜臺前,準(zhǔn)備將自己打工存下的5000元現(xiàn)金存起來。存錢的過程很順利,馮國光從包里掏出一張銀行儲蓄卡和現(xiàn)金一起遞給柜臺工作人員。可是等銀行工作人員拿出存款憑單,讓馮國光簽字確認(rèn)的時候他發(fā)現(xiàn)了個大問題,憑條上顯示的賬戶名稱,不是我的名字,而是一個叫劉強(qiáng)的人。馮國光說當(dāng)時他一下子就懵了。因為這個劉強(qiáng)他根本就不認(rèn)識他,咋把錢存到了別人的卡上?在銀行工作人員的詢問下,馮國光才慢慢回憶起來這張銀行卡是他從自己租住屋的床底下?lián)靵淼摹R驗樗灿幸粡堖@個銀行的借記卡所以還以為是自己不小心掉到床底下去的就直接把卡放到了自己的錢包里。 馮國光這下總算明白了自己把錢存到了別人卡上我該怎么辦?馮國光頓時手足無措,只能一再要求銀行的工作人員將這筆錢轉(zhuǎn)存到自己卡上,銀行工作人員了解到誤存的事情經(jīng)過后,表示按規(guī)定必須輸入正確的密碼才能取錢,或者找到銀行卡的戶主來取這筆錢,否則存入他人卡上的款項銀行也無權(quán)處置 我不知道密碼,最后只能先申請銀行把這筆業(yè)務(wù)凍結(jié)之后,馮國光多次找這家銀行和劉強(qiáng),希望能把錢追回來,可一直沒有解決,錢也不知所蹤。無奈之下馮國光只好將這家銀行和劉強(qiáng)起訴至新城區(qū)法院要求銀行和劉強(qiáng)返還這筆存款。法院審理認(rèn)為馮國光誤持劉強(qiáng)的儲蓄卡辦理存款,屬于民事法律行為中的重大誤解,馮國光要求返還這筆存款符合法律規(guī)定,最終法院判決由劉強(qiáng)向馮國強(qiáng)返還5000元現(xiàn)金,銀行協(xié)助辦理。這就發(fā)生了文中開頭的那一幕。 新城區(qū)法院民事審判庭王法官提醒說,市民在撿到別人丟失或者廢棄的銀行卡時,應(yīng)該及時交到發(fā)卡銀行尤其要注意在存款的過程中應(yīng)仔細(xì)核對賬號名稱,賬號數(shù)字以及存入金額等信息,避免此類事件的發(fā)生。他說如果誤將錢款存入他人賬戶要注意收集相關(guān)證據(jù)。如打印交易憑條,同時向銀行反映情況并申請財產(chǎn)保全保證錢款安全。 中國農(nóng)業(yè)銀行一位姓席的工作人員表示,萬一在銀行柜臺或者通過ATM機(jī)存款和轉(zhuǎn)賬時發(fā)生失誤,將錢存到他人賬戶時,市民應(yīng)該在第一時間告知銀行,可以找銀行的工作人員協(xié)助處理,也可以撥打銀行客服電話尋求幫助,同時必須向公安機(jī)關(guān)報案,由警方處理。如果對方拒不還款就必須通過司法程序解決,同時他提醒說持卡人可以在銀行卡背面的簽名欄里簽上自己的名字,這樣既可以提醒并避免拿錯卡,另一方面也方便銀行工作人員進(jìn)行核對。第二篇:java實訓(xùn) ATM取款機(jī)
第三篇:ATM取款機(jī)java課程設(shè)計
第四篇:uml 描述ATM自動取款機(jī)系統(tǒng)
第五篇:看著銀行ATM自助取款機(jī)的屏幕上