第一篇:JAVA課程設計報告ATM存取款系統
目 錄
1課程設計題目描述和基本設計要求...............................................................2 系統需求分析..................................................................................................2.1 功能需求分析 ······················································································
2.2 其他需求分析 ······················································································
3系統設計...........................................................................................................3.1 總體設計 ······························································································
3.2 ATM柜員機界面設計 ·········································································
3.3 各功能模塊設計 ··················································································
3.3.1 登陸頁面模塊設計 ································································
3.3.2 選擇服務模塊設計 ································································
3.3.3 取款模塊設計 ·······································································
3.3.4 退卡模塊設計 ······································································· 3.4 異常處理情況說明 ·································································· 系統實現與測試..............................................................................................5總程序...............................................................................................................6 課程設計總結..................................................................................................6.1 遇到的問題及解決辦法 ······································································
6.2 心得體會 ······························································································
ATM柜員機 課程設計題目描述和基本設計要求
ATM柜員機主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機的要求。系統需求分析 2.1 功能需求分析
主要功能如下所述:
要求使用圖形用戶界面。當輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統能登錄ATM柜員機系統,用戶可以按照以下規則進行:
? 查詢余額:初始余額為50000元
? ATM取款:每次取款金額為100的倍數,總額不超過5000元,支取金額不允許透支。
? ATM存款:不能出現負存款。
? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。
2.2 其他需求分析
(1)性能描述
實時性好、靈活性強、易于不同年齡階段的人操作。(2)設計約束
開發工具:JCrator ProV3.5.0 運行環境:Windows 2000以上 能實現用戶所定義的各項需求。(3)界面要求
以Windows窗口形式顯示,標題欄為ATM柜員機名稱,右上角有最小化按鈕、最大化按鈕、關閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。系統設計 3.1 總體設計
我所設計的ATM柜員機主要是由登錄頁面模塊還由選擇服務模塊組成,其中選擇服務模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結構圖如下所示:
圖1
ATM功能結構示意圖
3.2 ATM柜員機界面設計
一個系統界面的好壞直接影響到用戶的操作,界面設計要求樣式美觀、簡單明了、方便易操作。界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執行相應的操作。
(1)窗體的設計
窗體整個框架使用Frame類構造,Frame有自己的外邊框和自己的標題,創建Frame時可以指定其窗口標題,我創建的窗口標題是各個不同功能的模塊的名字,比如說查詢余額,還有取款等。相應源代碼為:WindowBox(String s,Account act){super(“ATM柜員機”);}、Selection(String s,Account act){ } super(s);向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”);
p1.add(button1);this.add(p1);每個Frame在其右上角都有三個控制圖標,分別代表將窗口最小化、窗口最大化和關閉的操作,其中最小化和最大化操作Frame可自動完成,而關閉窗口操作實現需要書寫有關的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應,調用dispose()方法關閉窗口。Frame也可以引發WindowsEvent類代表的窗口事件。相應源代碼為:
addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關閉事件
{ System.exit(0);} });}(2)窗體的主要結構的設計
我所設計的窗口的主要結構的特點就是每個窗口都對應著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務等,所以它們都是由各種按鈕和文本框,標簽組成的,而聯系各個窗體成為一個整體的就是各個按鈕的監聽事件。所以整個設計就趨向簡單化了。
為了定義各個按鈕所對應的命令和操作,首先需要將各個按鈕注冊給實現了動作事件的監聽接口ActionListener的監聽者,然后為監聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。
3.3 各功能模塊設計 3.3.1 登陸頁面模塊設計
與ATM柜員機打交道比較多的,也是大家對安全比較關心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續服務。
我定義了文本框累的對象tf1,tf2。抓藥是用于輸入單行的文本;文本區調用public String getText()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關掉窗口。
3.3.2 選擇服務模塊設計
在選擇服務模塊中,有各種ATM的服務功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應的界面。每一個按鈕都有監聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數e,監視器就會知道所發生的事件,對此事件進行處理。
3.3.3 取款模塊設計
在取款模塊中,和其他的界面也是同樣的結構。也是有一個文本框和一個按鈕還有標簽組成的。用戶在文本框中輸入他想取的數額,但是必須是100的倍數,而且每一次最多只能取5000塊。當然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負,否則就會彈出報錯的窗口。3.3.4 退卡模塊設計
在退卡模塊設計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==button4){//退出
} System.exit(0);dispose();這個方法就可以實現了,這里就不再多說了。
3.4 異常處理情況說明
(1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數據庫訪問時的異常處理 需要處理的異常:SQLException(3)加載類時的異常處理
需要處理的異常:ClassNotFindException,當應用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。
(4)加載URL時的異常
需要處理的異常:MalformedURLException,拋出這一異常指示出現了錯誤的 URL。或者在規范字符串中找不到任何合法協議,或者無法分析字符串。系統實現與測試
(1)編譯運行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報右下圖的錯誤。
圖2 主界面—登陸頁面
(2)選擇服務界面效果
當輸入的密碼和卡號正確,單擊確定后就會進入到選擇服務的界面,如圖3所示。然后就可以選擇所需要的服務了。
圖3 選擇服務界面
(3)取款界面,如圖4所示。
圖4 取款界面
(4)查詢余額界面,如圖7所示。
圖7 查詢余額界面
圖8 存款界面
圖9 轉賬界面
經過測試,所有的功能基本上都實現了,而且運行正常。.總程序
package ZDC;//主菜單
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel1 extends JPanel{ JLabel label1,label2;
Panel1(){
setLayout(new GridLayout(4,1));
label1=new JLabel(“
”+“銀行存取款系統”);label2=new JLabel(“
”+“歡迎你成為本行用戶,你可以選擇中文或英文方式”);
add(new JLabel());add(label1);add(label2);add(new JLabel());
} } class Panel2 extends JPanel{
JButton button1,button2;
Panel2(){
setLayout(new GridLayout(3,6));
button1=new JButton(“中文”);button2=new JButton(“英文”);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client extends JFrame implements ActionListener{
Panel1 panel1;Panel2 panel2;JFrame frame;
Client(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel1();panel2=new Panel2();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==“中文”){
this.setVisible(false);
new Client00(“輸入密碼”);
}
else if(e.getActionCommand()==“英文”){String inputValue = JOptionPane.showInputDialog(“Please input a value”);}
} } public class menu{
public static void main(String []args){
new Client(“用戶取款系統”);
}} package ZDC;
// 輸入密碼界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel01 extends JPanel{
JLabel label1,label2,label3,label4;JPasswordField textA;JTextField textC;
static JTextField textB;char t[]=new char[4];
Panel01(){
setLayout(new GridLayout(4,4));
for(int i=0;i<4;i++){t[i]=(char)(Math.random()*26+'a');}
String mm=new String(t);
label2=new JLabel(“請輸入卡號:”);label1=new JLabel(“請輸入密碼:”);
label3=new
JLabel();label4=new
JLabel(“
請
輸
入
驗
證”);label3.setBackground(Color.white);
碼
:
label3.setForeground(Color.red);
textC=new JTextField(10);textC.setForeground(Color.blue);
label3.setText(mm);
textA=new JPasswordField(6);textA.setEchoChar('*');textB=new JTextField(“");
for(int i=0;i<5;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());add(new JLabel());
add(label1);add(textA);add(new JLabel());add(new JLabel());
add(label4);add(textC);add(label3);
} } class Panel02 extends JPanel{ JButton button1,button2;
Panel02(){
setLayout(new GridLayout(3,6));
button1=new JButton(”確定“);button2=new JButton(”取消“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new JLabel());
add(button2);for(int i=0;i<6;i++){add(new JLabel());}
} } class Client00 extends JFrame implements ActionListener{
Panel01 panel1;Panel02 panel2;JFrame frame;int i=0,j=0;
Client00(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel01();panel2=new Panel02();
con.add(panel1);con.add(panel2);
JLabel());add(new
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
char[] passwords=panel1.textA.getPassword();String password=new String(”000000“);
//設置賬號123456789的初始密碼為112626,每輸入一次都有提示,在連續輸入三次不正確后系統自動退出。
”);}
if(e.getActionCommand().equals(“確定”))
if(panel1.textC.getText().equals(panel1.label3.getText())){
heshi();
}
else{JOptionPane.showMessageDialog(frame,“你輸入的驗證碼有誤,請重新輸入。
else if(e.getActionCommand()==”取消“){this.setVisible(false);new Client08(”“);}
}
public void heshi(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
請輸入賬號、密碼!“);return;} try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數據庫 Statement sql=con.createStatement();
String ql=panel1.textB.getText();
ResultSet rs=sql.executeQuery(”select cnima from card where cno=“+ql+”“);
if(rs.next()){
String qerycmima=panel1.textA.getText();
String s=rs.getString(1);
if(qerycmima.equals(s)){
JOptionPane.showMessageDialog(frame,”
連接成功!“);
this.setVisible(false);new Client01(”用戶取款系統“);
}else{ if(i!=2){i++;j=3-i;
JOptionPane.showMessageDialog(frame,”密碼有誤!你還有“+j+”次機會,請你再仔細想想.“);
panel1.textA.setText(”“);}
else {JOptionPane.showMessageDialog(frame,”對不起,你輸入的密碼次數達三次,下次再見。“);System.exit(0);}
}
con.close();frame.repaint();
}
else{JOptionPane.showMessageDialog(null,”
該用戶不存在,重新輸入!“,”警告!“, JOptionPane.YES_NO_OPTION);
panel1.textA.setText(”“);panel1.textB.setText(”“);panel1.textC.setText(”“);return;}
}catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage());
} catch(Exception e){ e.printStackTrace();
}
} } class Inputpassword{
public static void main(String []args){
new Client00(”用戶取款系統“);
}} package ZDC;//選擇界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel03 extends JPanel{
”);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new
JLabel());add(new
JButton button1,button2,button3,button4,button5;
Panel03(){
setLayout(new GridLayout(8,6));
button1=new JButton(“查詢”);button2=new JButton(“取款”);
button3=new JButton(“轉賬”);button4=new JButton(“退出”);button5=new JButton(“存款JLabel());
add(button2);for(int
i=0;i<8;i++){add(new
JLabel());}add(button3);add(new JLabel());add(new JLabel());add(button5);
for(int i=0;i<17;i++){add(new JLabel());}add(button4);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client01 extends JFrame implements ActionListener{
Panel03 panel1;JFrame frame;
Client01(String s){
super(s);
Container con=this.getContentPane();
panel1=new Panel03();con.add(panel1);
panel1.button1.addActionListener(this);panel1.button2.addActionListener(this);
panel1.button3.addActionListener(this);panel1.button4.addActionListener(this);panel1.button5.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”取款“){
this.setVisible(false);
new Client02(”請選擇取款金額“);
}
else if(e.getActionCommand()==”查詢“){
this.setVisible(false);
new Client06(”查詢服務“);
}
else if(e.getActionCommand()==”存款“){
this.setVisible(false);
new Client05(”請選擇存款金額“);
}
else if(e.getActionCommand()==”轉賬“){
this.setVisible(false);
new Client04(”用戶轉賬服務“);
}
else if(e.getActionCommand()==”退出“){ this.setVisible(false);new Client08(”“);}
} } class Selectfunction{
public static void main(String []args){
new Client01(”用戶取款系統“);
new Client01(”用戶存款系統“);
} } package ZDC;//查詢功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel06 extends JPanel{
JLabel label1,label2;JTextField textA;JFrame frame;
Panel06(){
setLayout(new GridLayout(4,4));label1=new JLabel(”你的余額為:“);
textA=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<9;i++){add(new JLabel());}
} } class Panel07 extends JPanel{
JButton button1,button2;
Panel07(){
setLayout(new GridLayout(3,6));
button1=new JButton(”繼續“);button2=new JButton(”查詢“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button2);add(new JLabel());
add(button1);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client03 extends JFrame implements ActionListener{
Panel06 panel1;Panel07 panel2;
Client03(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel06();panel2=new Panel07();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
JLabel());add(new
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”繼續“)){
this.setVisible(false);
new Client01(”選擇服務種類“);
}
else if(e.getActionCommand()==”查詢“)showcjine();
}
public void showcjine(){
//String
url
=
”jdbc:odbc:driver={Microsoft
Access
Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當前類目錄下的數據庫文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數據庫 Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);
if(rs.next()){
String ucjine=rs.getString(1);
panel1.textA.setText(ucjine);
}
else{JOptionPane.showMessageDialog(null,”
該用戶不存在“,”警告!“, JOptionPane.YES_NO_OPTION);}
con.close();
}catch(Exception ex){ ex.printStackTrace();
}
}
} class Searchfunction{
public static void main(String []args){
new Client03(”用戶查詢服務“);
}} package ZDC;
//查詢信息
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel11 extends JPanel{
JButton button1,button2;
Panel11(){
setLayout(new GridLayout(10,5));
button1=new JButton(”查詢余額“);
button2=new JButton(”查本卡信息“);
for(int i=0;i<=16;i++)add(new JLabel());
add(button1);
for(int i=0;i<=13;i++)add(new JLabel());
add(button2);
for(int i=0;i<=16;i++)add(new JLabel());} }
class Client06 extends JFrame implements ActionListener{
Panel11 panel11;JFrame frame;
Client06(String s){
super(s);
Container con=this.getContentPane();
panel11=new Panel11();
con.add(panel11);
panel11.button1.addActionListener(this);
panel11.button2.addActionListener(this);
this.setVisible(true);this.pack();}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”查詢余額“){
this.setVisible(false);
new Client03(”用戶查詢服務“);
}
else if(e.getActionCommand()==”查本卡信息“){ this.setVisible(false);
new Client07(”本卡信息“);
} } } class Searchinformation{
public static void main(String []args){
new Client06(”查詢服務“);
} } package ZDC;//轉賬功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel08 extends JPanel{
JLabel label1,label2;JTextField textA,textB;
Panel08(){
setLayout(new GridLayout(4,4));
label1=new JLabel(”輸入預轉賬號:“);label2=new JLabel(”輸入預轉金額:“);
textA=new JTextField(6);textB=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<6;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());
} } class Panel09 extends JPanel{
JButton button1,button2;
Panel09(){
setLayout(new GridLayout(3,6));
button1=new JButton(”確定“);button2=new JButton(”取消“);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client04 extends JFrame implements ActionListener{
Panel08 panel1;Panel09 panel2;JFrame frame;
Client04(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel08();panel2=new Panel09();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”確定“)){ zhuanzhang();//程序根據輸入賬號調用數據庫,修改對應金額數。
this.setVisible(false);
new Client01(”用戶取款系統“);
}
else if(e.getActionCommand()==”取消“){
this.setVisible(false);
new Client01(”用戶取款系統“);}
}
public void zhuanzhang(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
請輸入欲轉賬號、金額!“);return;} //String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當前類目錄下的數據庫文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數據庫 Statement sql=con.createStatement();String cno=panel1.textA.getText();String ql=Panel01.textB.getText();
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
ResultSet ss=sql.executeQuery(”select cno from card where cno=“+cno+”“);String yjine=panel1.textB.getText();
int shjin=Integer.parseInt(yjine);
if(ss.next()){
ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String queryjine=rs.getString(1);
int qyjine=Integer.parseInt(queryjine);
if(shjin String newjine=String.valueOf(newcjine);String newjine2=String.valueOf(newcjine2); sql.executeUpdate(”update card set cjine='“+newjine+”'where cno=“+ql+”“); sql.executeUpdate(”update card set cjine='“+newjine2+”'where cno=“+cno+”“);JOptionPane.showMessageDialog(frame,” 操作已成功,謝謝使用!“);this.setVisible(false);new Client01(”用戶取款系統“); } else{JOptionPane.showMessageDialog(null,” 請重新輸入金額!“,”警告!“, JOptionPane.YES_NO_OPTION); panel1.textB.setText(”“);return; } con.close();frame.repaint(); } con.close();frame.repaint(); } else{JOptionPane.showMessageDialog(null,” 警告!“, JOptionPane.YES_NO_OPTION);panel1.textA.setText(”“);} }catch(Exception ex){ ex.printStackTrace(); } } } class Transferfunction{ public static void main(String []args){ new Client04(”用戶轉賬服務“);}} package ZDC;//用戶取款 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; 該用戶不存在,請重新輸入。”,“ import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel04 extends JPanel{ JButton button1,button2,button3,button4; Panel04(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel05 extends JPanel{ JButton button1,button2,button3,button4; Panel05(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client02 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client02(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); qukuan();//程序根據輸入金額和輸入卡號,修改數據庫。 new Client01(”用戶取款系統“); } else if(e.getActionCommand()==”200“){ else if(e.getActionCommand()==”300“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統“);} this.setVisible(false); qukuan(); new Client01(”用戶取款系統“);} else if(e.getActionCommand()==”500“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統“);} else if(e.getActionCommand()==”800“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統“);} else if(e.getActionCommand()==”1000“){ } public void qukuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數據庫 Statement sql=con.createStatement();String ql=Panel01.textB.getText(); this.setVisible(false); qukuan(); new Client01(”用戶取款系統“);} ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);if(queryjine if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,謝謝使用!“);} this.setVisible(false); new Client01(”用戶取款系統“); } else{JOptionPane.showMessageDialog(null,” 你的卡余額已不足,請注意!“,”警告!“, JOptionPane.YES_NO_OPTION); } con.close(); frame.repaint(); } }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Withdraw{ public static void main(String []args){ new Client02(”請選擇取款金額“); } } this.setVisible(false);new Client01(”用戶取款系統“);package ZDC; //存款功能 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel10 extends JPanel{ JButton button1,button2,button3,button4; Panel10(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel14 extends JPanel{ JButton button1,button2,button3,button4; Panel14(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client05 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client05(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); cunkuan();//程序根據輸入金額和輸入卡號,修改數據庫。 new Client01(”用戶存款系統“); } else if(e.getActionCommand()==”200“){this.setVisible(false);new Client01(”用戶存款系統“);} //這里當點擊取款金額200時,程序返回上層操作界面。 } public void cunkuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數據庫 Statement sql=con.createStatement();String ql=Panel01.textB.getText();ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“); if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);int newjine=nn+queryjine;String newjin=String.valueOf(newjine);int updateMima=sql.executeUpdate(”update card set cjine='“+newjin+”'where cno=“+ql+”“); if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,謝謝使用!“);} this.setVisible(false); new Client01(”用戶存款系統“); } else{JOptionPane.showMessageDialog(null,” 請注意!“,”警告!“, JOptionPane.YES_NO_OPTION); this.setVisible(false);new Client01(”用戶取款系統“);} con.close(); frame.repaint(); }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Depositfunction{ public static void main(String []args){ new Client05(”請選擇存款金額“); } } package ZDC;//顯示用戶信息 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*; class Panel12 extends JPanel{ JLabel label1,label2,label3,label4; JButton button1,button2;JTextField text1,text2,text3,text4; Panel12(){ setLayout(new GridLayout(9,6)); label1=new JLabel(”顯示用戶名:“);label2=new JLabel(”顯示性別:“); label3=new JLabel(”顯示身份證:“);label4=new JLabel(”顯示卡號:“); button1=new JButton(”查詢“);text1=new JTextField(”“);text2=new JTextField(”“); button2=new JButton(”取消“);text3=new JTextField(”“);text4=new JTextField(”“); for(int i=0;i<8;i++)add(new JLabel());add(label1);add(text1); for(int i=0;i<4;i++)add(new JLabel());add(label2);add(text2); for(int i=0;i<4;i++)add(new JLabel());add(label3);add(text3); for(int i=0;i<4;i++)add(new JLabel());add(label4);add(text4); for(int i=0;i<15;i++)add(new JLabel());add(button1); add(new JLabel());add(new JLabel());add(button2); for(int i=0;i<7;i++)add(new JLabel());} } class Client07 extends JFrame implements ActionListener{ Panel12 panel12;JFrame frame; Client07(String s){ super(s); Container con=this.getContentPane(); panel12=new Panel12(); con.add(panel12); panel12.button1.addActionListener(this); panel12.button2.addActionListener(this); this.setVisible(true);this.pack();} public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”查詢“)showCard(); else if(e.getActionCommand()==”取消“){ this.setVisible(false); new Client01(”用戶取款系統“); } } public void showCard(){ String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當前類目錄下的數據庫文件 try{ Connection con=DriverManager.getConnection(url);Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select * from user where ucno=“+ql+”“); if(rs.next()){ String uname=rs.getString(1); String usex=rs.getString(2); String uid=rs.getString(3); String ucno=rs.getString(4); panel12.text1.setText(uname); panel12.text2.setText(usex); panel12.text3.setText(uid); panel12.text4.setText(ucno);} else{JOptionPane.showMessageDialog(null,” 該用戶不存在“,”警告!“, JOptionPane.YES_NO_OPTION);} con.close(); } catch(Exception ex){ ex.printStackTrace(); } } } class Dislayuserinformation{ public static void main(String []args){ new Client07(”本卡信息“); } } package ZDC;//退出功能 class Client08{ static Athread threadA; Client08(String s){ threadA=new Athread(); threadA.start(); } } class Athread extends Thread{ static int j=1;public void run(){ for(;j<2;){ new Client08(”提示退出對話框“);try{sleep(30000);j++;} catch(InterruptedException e){} } System.exit(0);} } public class Exit{ public static void main(String []args){ new Client08(”“); } } package ZDC;//退卡 import java.awt.*;import java.sql.Connection; import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import java.awt.event.*;class Panel13 extends JPanel{ JLabel label; Panel13(){ label=new JLabel(” 此卡! “); setLayout(new GridLayout(10,1));add(new JLabel()); add(label);for(int i=0;i<6;i++)add(new JLabel());} } class Client09 extends JFrame{ Panel13 panel13; Client09(String s){ super(s); Container con=this.getContentPane(); panel13=new Panel13(); con.add(panel13); this.setVisible(true);this.pack();} } class bankSystem09{ 謝謝使用,請在30秒內退出 JLabel());add(new JLabel());add(new public void main(String []args){ new Client08(”提示退出對話框"); } } 6課程設計總結 6.1 遇到的問題及解決辦法 在此次課程設計中,我遇到了一些問題,如:對于面向對象的方法了解不夠透徹,運用到實際的軟件開發中存在著困難;對于Java語言,只學習到了一些最基本的知識,這導致編寫程序時經常出現一些語法錯誤,而且要在短時間內用Java語言來設計一個具體的系統是一個較大的挑戰。對于以上的問題,自己有清楚的認識,解決辦法是需要大量閱讀相關的書籍,對于書上以及網站上下載的資料中的Java實例必須有清楚的理解。對于實際動手能力與系統開發的流程的適應,必須多進行實際的練習與操作,才能有大的進步。 6.2 心得體會 在這次的課程設計中,我主要運用了Java語言的界面設計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運用了Java語言。我深刻感受到了面向對象語言中類庫的強大功能,掌握了運用Java中的類實現某些基本功能,并學會了自己查詢使用類的方法,為以后的面向對象語言的自學奠定了基礎。在以后的學習當中,我會更加努力的學習好專業知識,并將所學的知識用于實踐當中去,以便牢固掌握知識。 《Java語言程序設計》 課程設計報告 題 目: ATM柜員機 專 業: 信息與計算科學 學 號: 姓 名: 單 焱 指導教師: 李 又 良 成績: 2010 年 12 月 10 日 目 錄 1課程設計研究背景及意義.......................................2 2 課程設計題目描述和基本功能設計要求...........................2 3 系統需求分析.................................................2 3.1 功能需求分析............................................2 3.2 其他需求分析............................................3 4 系統設計.....................................................3 4.1 總體設計................................................3 4.2 ATM柜員機界面設計......................................4 4.3 各功能模塊設計..........................................5 4.3.1 登陸頁面模塊設計................................5 4.3.2 選擇服務模塊設計................................6 4.3.3 取款模塊設計....................................7 4.3.4 修改密碼模塊設計................................8 4.3.5 查詢余額模塊設計................................9 4.3.6 退卡模塊設計....................................9 4.4 異常處理情況說明.......................................10 5 系統實現與測試..............................................10 6 課程設計總結................................................13 6.1 遇到的問題及解決辦法...................................13 6.2 心得體會...............................................14 參考文獻......................................................14 附錄(源碼)..................................................14 1課程設計研究背景及意義 這次課程設計是通過JAVA編程來實現ATM柜員機的功能。以前,人們用手算取錢,不管從方便的角度還是速度的角度來看都不及現在。電子技術的不斷發展使得ATM自動化的功能不斷完善。在二十一世紀的今天,ATM柜員機是人們生活中重要的工具,所以,對ATM柜員機的研究的課程設計具有重大意義。 這次課程設計的主要目的是結合面向對象程序設計課程,培養我們面向對象開發的思維,初步了解軟件開發的一般流程,提高用JAVA編程的實際動手能力并增強大家對面向對象的了解。這次課程設計的主要內容是獨立用JAVA語言開發一個小的應用程序。課程設計題目描述和基本功能設計要求 本次設計的ATM柜員機主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機的要求。組員分工: 組長(單焱): 負責分配其他組員的任務,構建需求分析,系統實現及異常處理情況,調試程序等,把握ATM柜員機的整體布局。 組員1(劉星):負責登陸界面模塊,選擇服務模塊及退卡模塊,編寫相應代碼。組員2(王玲玲):負責取款、修改密碼、查詢余額模塊,編寫相應代碼。系統需求分析 3.1 功能需求分析 本ATM柜員機的主要功能如下所述: 要求使用圖形用戶界面。當輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統能登錄ATM柜員機系統,用戶可以按照以下規則進行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數,總額不超過5000元,支取金額不允許透支。 ? ATM存款:不能出現負存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。 3.2 其他需求分析 (1)性能描述 實時性好、靈活性強、易于不同年齡階段的人操作。(2)設計約束 開發工具:Eclipse3.2.運行環境:Windows 2000以上。(3)界面要求 以Windows窗口形式顯示,標題欄為ATM柜員機名稱,右上角有最小化按鈕、最大化按鈕、關閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。系統設計 4.1 總體設計 本次設計的ATM柜員機主要是由登錄頁面模塊還由選擇服務模塊組成,其中選擇服務模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。如圖: 圖1 ATM功能結構示意圖 4.2 ATM柜員機界面設計 一個系統的界面應該要簡單明了,當然樣式美觀就更好了。本次設計的界面主要是由窗體組成,操作簡單。而每一個窗口則執行相應的功能。 一個系統界面的好壞直接影響到用戶的操作,界面設計要求樣式美觀、簡單明了、方便易操作。界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執行相應的操作。 (1)窗體的設計 窗體整個框架使用Frame類構造,Frame有自己的外邊框和自己的標題,創建Frame時可以指定其窗口標題,我創建的窗口標題是各個不同功能的模塊的名字,比如說查詢余額,還有取款等。相應源代碼為:WindowBox(String s){super(s);}、Selection(String s,Account act){ } 向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”); p1.add(button1);this.add(p1);super(s);每個Frame在其右上角都有三個控制圖標,分別代表將窗口最小化、窗口最大化和關閉的操作,其中最小化和最大化操作Frame可自動完成,而關閉窗口操作實現需要書寫有關的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應,調用dispose()方法關閉窗口。Frame也可以引發WindowsEvent類代表的窗口事件。相應源代碼為: addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關閉事件 { System.exit(0);} });}(2)窗體的主要結構的設計(網格布局) 我所設計的窗口的主要結構的特點就是每個窗口都對應著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務等,所以它們都是由各種按鈕和文本框,標簽組成的,而聯系各個窗體成為一個整體的就是各個按鈕的監聽事件。所以整個設計就趨向簡單化了。 為了定義各個按鈕所對應的命令和操作,首先需要將各個按鈕注冊給實現了動作事件的監聽接口ActionListener的監聽者,然后為監聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。 4.3 各功能模塊設計 4.3.1 登陸頁面模塊設計 與ATM柜員機打交道比較多的,也是大家對安全比較關心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續服務。 我定義了文本框累的對象tf1,tf2。抓藥是用于輸入單行的文本;文本區調用public String getText()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關掉窗口。此模塊相應的部分源代碼為: public void actionPerformed(ActionEvent e){ Account act; String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*選擇各種服務*/ 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(“選擇服務”,act); }else{ dispose(); JOptionPane.showMessageDialog(null, “您輸入的卡號或密碼不正確,請核實后再確定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); new WindowBox(“登錄界面”); } } /*退卡*/ if(e.getSource()==button2){ dispose(); JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } } 4.3.2 選擇服務模塊設計 在選擇服務模塊中,有各種ATM的服務功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應的界面。每一個按鈕都有監聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數e,監視器就會知道所發生的事件,對此事件進行處理。其中的部分源代碼為: p.add(new Label(“請選擇你要的服務”)); 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);setBounds(300,300,300,300);setVisible(true);validate();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button2){//取款 dispose(); GetBalance gb = new GetBalance(“取款”,act);} if(e.getSource()==button3){//查詢余額 Query q =new Query(“查詢余額”,act); dispose();} else if(e.getSource()==button4){//退出 dispose(); } JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } else if(e.getSource()==button5){//修改密碼 ChangePassword cp = new ChangePassword(“修改密碼”,act); dispose();} 4.3.3 取款模塊設計 在取款模塊中,和其他的界面也是同樣的結構。也是有一個文本框和一個按鈕還有標簽組成的。用戶在文本框中輸入他想取的數額,但是必須是100的倍數,而且每一次最多只能取5000塊。當然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負,否則就會彈出報錯的窗口。其方法為: if(e.getSource()== button){ if(act.get_Money()< 0){// 判斷余額是否為負 dispose();JOptionPane.showMessageDialog(null, “余額為負數”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取錢的數額不大于余額 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“選擇服務”, act);} if((money % 100!= 0)||(money >= 5000)){// 取錢數為100的倍數或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的錢!“, ”消息“,務窗口 } ”每次只能取100的倍數,而且不能超過5000,請重新輸入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“選擇服務”, act);// 返回選擇服} else if(money > act.get_Money()){// 判斷取款數額是否大于余額 dispose(); JOptionPane.showMessageDialog(null, “超過已有的錢數,請重新輸入你想取的錢!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } Selection s = new Selection(“選擇服務”, act);} 4.3.4 修改密碼模塊設計 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會報錯。再一個就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會報錯,然后再重新回到修改密碼的界面。在修改密碼時用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(act.get_Password())){ /*判斷兩次輸入的密碼是否匹配*/ if(pwd3.equals(pwd4)){ /*如果都正確的話就設置新密碼*/ 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 查詢余額模塊設計 在查詢余額模塊設計中, 和其他的界面的結構相差不多。有一個余額顯示和一個按鈕還有標簽組成的。查詢時用到的方法: Query(String s, Account act){// 構造函數 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()));// 查詢余額的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(300, 300, 300, 300);setVisible(true); 方法 } 4.3.6 退卡模塊設計 在退卡模塊設計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==button4){//退出 dispose();JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} 這個方法就可以實現了,這里就不再多說了。 4.4 異常處理情況說明 (1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數據庫訪問時的異常處理 需要處理的異常:SQLException(3)加載類時的異常處理 需要處理的異常:ClassNotFindException,當應用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。 (4)加載URL時的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現了錯誤的 URL。或者在規范字符串中找不到任何合法協議,或者無法分析字符串。系統實現與測試 (1)編譯運行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報右下圖的錯誤。 圖2 主界面—登陸頁面 (2)選擇服務界面效果 當輸入的密碼和卡號正確,單擊確定后就會進入到選擇服務的界面,如圖3所示。然后就可以選擇所需要的服務了。 圖3 選擇服務界面 (3)取款界面,如圖4所示。 圖4 取款界面 當輸入的錢數不是100的倍數或每一次大于5000時就會報圖5的錯誤。 圖5 輸入錯誤1 當取款時如果超過卡里的余額的話就會報圖6的錯誤。 圖6 輸入錯誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 (5)修改密碼界面,如圖8所示。 圖8 修改密碼界面 當輸入的初始密碼不正確會報圖9所示錯誤。 圖9 輸入錯誤1 當2次輸入的新密碼不同會報圖10所示錯誤。 圖10 輸入錯誤2 經過測試,所有的功能基本上都實現了,而且運行正常。課程設計總結 6.1 遇到的問題及解決辦法 在此次課程設計中遇到了一些問題,如:對于面向對象的方法了解不夠透徹,運用到實際的軟件開發中存在著困難;對于Java語言,只學習到了一些最基本的知識,這導致編寫程序時經常出現一些語法錯誤,而且要在短時間內用Java語言來設計一個具體的系統是一個較大的挑戰;還有對于正規開發一個系統的流程不熟悉,適應起來比較慢,編寫各個模塊相對應的操作時,自己感覺難以動手,這表明所學的知識不能靈活運用到實際中。 對于以上的問題,自己有清楚的認識,解決辦法是需要大量閱讀相關的書籍,對于書上以及網站上下載的資料中的Java實例必須有清楚的理解,還有就是多跟精通此方面的老師和同學交流,取其精華。對于實際動手能力與系統開發的流程的適應,必須多進 行實際的練習與操作,才能有大的進步。 6.2 心得體會 在這次的課程設計中,主要運用了Java語言的界面設計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運用了Java語言。深刻感受到了面向對象語言中類庫的強大功能,掌握了運用Java中的類實現某些基本功能,并學會了自己查詢使用類的方法,為以后的面向對象語言的自學奠定了基礎。 通過這次課程設計我學到了一些東西,這次的課程設計中,主要是運用JAVA語言來編寫一個小的應用程序,當然還可以用其他的技術來輔助。在這個小應用程序當中,我用了Java外還用了Swing控件。輸入輸出流等。由于以前學的不是很扎實,而且還有些知識我們都是沒有學過的,這就要求我們去查相關的書籍,還有就是和同學之間的交流。正因為這樣,才鍛煉了我的自學的能力,還有就是加深了我對各個知識點的認識,并且提高了我對專業的學習的興趣,為我以后的學習打下了基礎。此外,還感受到了面向對象語言的類庫的強大的功能,掌握了運用JAVA中的類實現某些基本功能,并學會了自己查詢使用類的方法,也就是要會用API文檔,為以后更好的學習面向對象語言奠定了基礎。 通過努力,這次課程設計終于完成了,在這個過程當中,學到了很多的知識,同時也感謝我的同學的幫助和指導。在以后的學習當中,我會更加努力的學習好專業知識,并將所學的知識用于實踐當中去,以便牢固掌握知識。 參考文獻 [1] 王萌,劉婧,來賓著.JAVA程序設計[M]北京 冶金工業出版社,2004 [2] 黃聰明 精通 JAVA2程序設計[M]北京:清華大學出版社,2004.4 [3] 王文濤,袁海燕 JAVA實用程序設計100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設計[M]北京:清華大學出版社,2006.8 [5] 劉寶林 JAVA程序設計與案例[M]北京:高等教育出版社,2006.11 附錄(源碼) /******登陸頁面首窗口*******/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; import java.io.*; public class WindowBox extends Frame implements ActionListener { Box baseBox, box1, box2;TextField tf1, tf2;Button button1;Button button2; WindowBox(String s){// 構造方法 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());/* 監聽器 */ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(300,300,220,220);setVisible(true);} public void actionPerformed(ActionEvent e){ Account act;String card;String pwd;act = new Account(“000000”, “Devil”, “123456”, 50000);// 初始化 /* 選擇各種服務 */ 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(“選擇服務”, act);} else { dispose(); JOptionPane.showMessageDialog(null, “您輸入的卡號或密碼不正確,請核實后再確定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); // 報輸入密碼或卡號不正確 new WindowBox(“登錄界面”); } } if(e.getSource()== button2){ System.exit(0); dispose();// 退出 } } } /*************主函數****************/ public class ATM { public static void main(String[] args){ new WindowBox(“登錄頁面”);} } /********* 選擇服務窗口 ***************/ import java.awt.*;import java.awt.event.*; public 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(“請選擇你要的服務”));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);setBounds(300, 300, 300, 300);setVisible(true);validate(); } } public void actionPerformed(ActionEvent e){ } if(e.getSource()== button2){// 取款 dispose();GetBalance gb = new GetBalance(“取款”, act);} if(e.getSource()== button3){// 查詢余額 Query q = new Query(“查詢余額”, act);dispose();} else if(e.getSource()== button4){// 退出 dispose(); JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} else if(e.getSource()== button5){// 修改密碼 ChangePassword cp = new ChangePassword(“修改密碼”, act);dispose();} /**********取款功能************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public class GetBalance extends Frame implements ActionListener { Box baseBox, box1, box2;Button button;TextField tf;Account act; GetBalance(String s, Account act){// 構造函數 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(“請輸入你想取錢的數目”));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(300, 300, 300, 300);this.setVisible(true);} public void actionPerformed(ActionEvent e){ // System.out.println(e.getActionCommand()); double money;money = Double.parseDouble(tf.getText().trim());if(e.getSource()== button){ if(act.get_Money()< 0){// 判斷余額是否為負 dispose();JOptionPane.showMessageDialog(null, “余額為負數”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取錢的數額不大于余額 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“選擇服務”, act);} if((money % 100!= 0)||(money >= 5000)){// 取錢數為100的倍數或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的錢!“, ”消息“,務窗口 ”每次只能取100的倍數,而且不能超過5000,請重新輸入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“選擇服務”, act);// 返回選擇服 // dispose();} } else if(money > act.get_Money()){// 判斷取款數額是否大于余額 dispose();JOptionPane.showMessageDialog(null, “超過已有的錢數,請重新輸入 你想取的錢!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false);口 Selection s = new Selection(“選擇服務”, act);// 返回選擇服務窗 } } } } /********修改密碼功能*************/ import java.awt.Button;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Label;import java.awt.Panel;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JOptionPane; 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;Button button;Account act;ChangePassword(String s, Account act){ super(s); this.act = act; tf4 = new TextField(6); tf5 = new TextField(6); tf6 = new TextField(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(300, 300, 300, 300);this.setVisible(true);/* 窗口事件 */ 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; pwd2 = tf4.getText(); pwd3 = tf5.getText(); pwd4 = tf6.getText(); if(pwd2.equals(act.get_Password())){// 判斷舊密碼是否正確 if(pwd3.equals(pwd4)){// 判斷兩次輸入的新密碼是個匹配 act.setPassword(pwd3);// 啟用新的密碼 dispose(); JOptionPane.showMessageDialog(null, “密碼修改成功!”, “消息 JOptionPane.INFORMATION_MESSAGE); ”,Selection s = new Selection(“選擇”, act);// 返回服務窗口 } else { this.setVisible(true); // ErrorWarn2 ew = new ErrorWarn2(“消息”,act);dispose();JOptionPane.showMessageDialog(null, “兩次密碼輸入不匹配”, “ JOptionPane.INFORMATION_MESSAGE); 消息”,Selection s = new Selection(“選擇”, act);// 返回服務窗口 } } else { this.setVisible(false);dispose(); “,} JOptionPane.showMessageDialog(null, ”初始密碼輸入錯誤“, ”消息 JOptionPane.INFORMATION_MESSAGE); Selection s = new Selection(“選擇”, act);// 返回選擇服務窗口 } } } /**************查詢余額功能******************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public class Query extends Frame implements ActionListener { Button button;Account act; Query(String s, Account act){// 構造函數 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(300, 300, 300, 300); setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()== button){ dispose(); Selection s = new Selection(“選擇服務”, act);// 返回選擇服務窗口 } } } /***********賬戶****************/ import java.io.*;/* 該類為實現客戶信息及部分功能 */ public 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;} /* 得到剩余的錢的數目 */ protected void set_Balance(double mon){ money-= mon;} /* 重置密碼的方法 */ public String setPassword(String pwd){ password = pwd;return password;} Java期中課程設計報告 報告題目:ATM模擬程序 姓名: 學號:2009118246 學院:信息科學與技術學院 專業:計算機科學與技術 一、課程設計目的和內容 目的:課程設計的主要目的是結合面向對象程序設計課程,培養面向對象軟件開發的思維,初步了解軟件開發的一般流程,提高用JAVA編程的實際動手能力并增強大家對面向對象的了解。 內容:設計ATM取款機主要包括登錄頁面、選擇服務、存款、取款、查詢余額、修改密碼和退出等功能。注:各種按鈕的事件和功能簡單模擬ATM取款機的要求。 二、系統需求分析 1、功能需求分析(1)模擬ATM柜員機程序; (2)修改密碼。當用戶需要修改密碼時,可以用這個功能,新密碼長度不小于6位,不允許出現6位完全相同的情況,只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。(3)取款。用戶根據自己需要取多少錢,輸入要取的金額,每次取款金額為100的倍數,總額不超過5000元,支取金額不允許透支。(4)查詢余額。用戶需要知道自己帳戶還剩多少錢時,可以查詢自己帳戶的余額。 (5)存款。用戶可以存款,金額為100的倍數,不能出現負存款。(6)鎖機。當用戶3次輸入密碼錯誤時,停止操作。 2、設計需求分析 A界面設計簡潔、友好、美觀大方。B操作簡單、快捷方便。 C信息分類清晰、準確。3.ATM功能模塊圖 4、約束條件(1)設計工具 開發工具:NetBeans 運行環境:Windows 7(2)界面要求 以Windows窗口形式顯示,標題欄為ATM自動取款機不同的窗口中有不同的按鈕和選擇菜單。 三、系統設計 1、功能結構模塊圖 我們所設計的ATM柜員機主要是由登錄頁面模塊還由選擇服務模塊組成,其中選擇服務模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結構圖如下所示: 2、業務流程圖 四、詳細設計 1、界面設計概述 我設計的ATM機,主要應用java圖形用戶界面開發的知識,在netbeans上根據要求來創建窗體,窗體整個框架使用JFrame類構造,JFrame有自己的外邊框和自己的標題,創建JFrame時可以指定其窗口標題,在創建窗口時,好多代碼是自動生成,我只是在其基礎上添加一些約束條件的代碼,比如說每次輸入的取款金額必須為100的整數,當密碼輸入三次錯誤,便鎖卡等代碼需要自己編寫,這里我會主要說明自己編寫的那部分代碼,也是程序中比較重要的部分,其中有許多Swing組件重復應用,代碼相同,在報告中不重復說明,比如說數字“0-9”的代碼,“退卡”按鈕的代碼等。 1、各模塊界面設計與程序設計 主模塊設計: 主函數中定義了6個靜態變量:密碼(thePassword),余額(balance),新密碼1(password1),新密碼2(password2),其中密碼為String類型,余額是double型,計數器(counter),用來記密碼的輸入次數,整型,初始化為0,dataStr是String類型,初始化為空字符串,還定義了FileWriter()和FileReader()方法分別用來寫和讀ATM在交易中的余額和密碼也就是dataStr,使用戶的余額和密碼變成變化后的值。在主方法中首先要調用一次FileReader()方法,獲取余額和密碼。程序代碼如下: import java.io.*;public class Atm { /** * @param args the command line arguments */ static String thePassword; static double balance; static int counter = 0; static String password1; static String password2; static String filePath = “./temp.txt”; static File file = new File(filePath);static String dataStr = “";//寫文件 static void FileWriter(){ String dataStr; try{ if(!file.exists()) file.createNewFile(); dataStr = balance + ”,“ + thePassword + ”,“; byte[] data = dataStr.getBytes(); FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); } catch(Exception e){ e.printStackTrace(); } } //讀文件 static void FileReader(){ try{ if(!file.exists()) file.createNewFile(); byte[] data = new byte[64]; FileInputStream fis = new FileInputStream(file); int rs = 0; while((rs = fis.read(data))> 0){ dataStr += new String(data,0,rs); } if(!dataStr.isEmpty()){ String[] sets = dataStr.split(”,“); balance = Double.parseDouble(sets[0]); thePassword = sets[1]; } fis.close(); } catch(Exception e){ e.printStackTrace(); } } public static void main(String args[]){ FileReader();//調用讀文件 try { for(javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()){ if(”Nimbus“.equals(info.getName())){ javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch(ClassNotFoundException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(InstantiationException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(IllegalAccessException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(javax.swing.UnsupportedLookAndFeelException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } AtmWelcome aw=new AtmWelcome();aw.setSize(390,290); aw.setVisible(true); } } 1)待機界面 這個界面可以說是一個待機界面,點擊“插卡”按鈕,進入登陸界面,其過程相當于ATM讀取磁卡信息的過程,利用了Swing控件中的標簽和按鈕,在“插卡”按鈕添加鼠標點擊事件代碼如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnter().setVisible(true);//進入登陸界面 this.setVisible(false);} 2)登陸界面 這個登陸界面,用戶名和賬號在插卡時相當于系統已經讀取,所以下面這個界面只是密碼驗證,輸入正確的密碼,若正確,則進入主交易界面,若錯誤則進入密碼錯誤,重新輸入,若輸入3次錯誤,則進入鎖卡界面,具體界面和程序代碼如下所示: “確定”按鈕的鼠標點擊事件代碼(用戶三次輸入錯誤判斷程序): private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: int l=jPasswordField1.getText().length(); if(l==6&&jPasswordField1.getText().equals(Atm.thePassword)) { new AtmEnterSuccess().setVisible(true); this.setVisible(false);} else if(Atm.counter<2) {new AtmPasswordError().setVisible(true); this.setVisible(false); Atm.counter++; } else{new AtmLock().setVisible(true); this.setVisible(false); } } “數字0-9”按鈕的鼠標點擊事件代碼: public void setNumber(String c){ jPasswordField1.setText(jPasswordField1.getText()+c); } private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”1“); } private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”2“);} private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”3“);} private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”4“);} private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”5“);} private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”6“);} private void jButton7MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”7“);} private void jButton8MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”8“);} private void jButton9MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”9“);} private void jButton12MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”0“);} “退卡”按鈕的鼠標點擊事件代碼: private void jButton10MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWelcome().setVisible(true);//返回到待機界面 this.setVisible(false);} “更正”按鈕的鼠標點擊事件代碼: private void jButton14MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: int l = jPasswordField1.getText().length(); if(l!= 0) jPasswordField1.setText(jPasswordField1.getText().substring(0,l-1));} 3)主交易界面 這個界面分別設計了“查詢余額”按鈕,“取款”按鈕,“修改密碼”按鈕等,點擊時分別進入相應的功能界面,具體代碼如下所示:“查詢余額”按鈕的鼠標點擊事件代碼: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmAccountBalance().setVisible(true);//進入顯示余額界面 this.setVisible(false);} “取款”按鈕的鼠標點擊事件代碼: private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWithdrawl().setVisible(true);//進入取款界面 this.setVisible(false);} “存款”的鼠標點擊事件代碼: private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDeposit().setVisible(true);//進入存款界面 this.setVisible(false);} “修改密碼”的鼠標點擊事件代碼: private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmPasswordChange().setVisible(true);//進入密碼修改界面 this.setVisible(false);} 4)密碼錯誤界面 當在登錄界面登陸時,若密碼錯誤則出現密碼錯誤界面,這個界面上點擊“繼續” 按鈕則返回到登陸界面重新輸入密碼,具體代碼如下: “繼續”按鈕的鼠標點擊事件代碼: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnter().setVisible(true);//返回到登陸界面 this.setVisible(false);} 5)鎖卡界面 密碼輸錯3次,卡鎖,代碼見登陸界面的“確定”按鈕點擊事件代碼。6)余額查詢界面 點擊“繼續”則返回到主交易界面,具體的代碼如下: 顯示余額的代碼: public AtmAccountBalance(){ initComponents(); java.awt.EventQueue.invokeLater(new Runnable(){ public void run(){ setVisible(true); } }); jLabel1.setText(”當前余額:“+ Atm.balance); Atm.FileWriter();} “繼續”按鈕的鼠標點擊代碼如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//進入主交易界面 this.setVisible(false);} 7)取款界面 取款界面規定單次最多取款5000元,若所取金額在界面上有,則直接點擊相應按鈕,若沒有,則點擊“其他面額”按鈕,然后輸入自己想取得面額,具體事件代碼如下: 100,300,500,1000,2000按鈕的鼠標點擊事件代碼如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton1.getText())) { new AtmWithdrawlSuccess().setVisible(true);//進入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton1.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//進入余額不足界面 this.setVisible(false); } } private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton3.getText())) { new AtmWithdrawlSuccess().setVisible(true);//進入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton3.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//進入余額不足界面 this.setVisible(false); } } private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here if(Atm.balance>=Double.valueOf(jButton5.getText())) { new AtmWithdrawlSuccess().setVisible(true);//進入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton5.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//進入余額不足界面 this.setVisible(false); } } private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton4.getText())) { new AtmWithdrawlSuccess().setVisible(true);//進入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton4.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//進入余額不足界面 this.setVisible(false); } } private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton6.getText())) { new AtmWithdrawlSuccess().setVisible(true);//進入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton6.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//進入余額不足界面 this.setVisible(false); } } “其他面額”按鈕鼠標點擊事件代碼: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWithdrawlInput().setVisible(true);//輸入取款金額界面 this.setVisible(false);} “返回”按鈕的鼠標點擊事件代碼: private void jButton7MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//返回主交易界面 this.setVisible(false);} 8)取款金額輸入界面 這個界面是當用戶所想取得金額在界面上沒有的時候,便需要用戶自己輸入,規定輸入的金額必須是100的倍數,且不大于5000元,具體事件代碼如下所示:(其中按鈕0-9的代碼,“退卡”按鈕等的代碼和前面相同) “確定”按鈕的鼠標事件代碼: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: double a=Double.valueOf(jTextField1.getText()); if(Atm.balance>=a&&a%100==0&&a<=5000.0){ new AtmWithdrawlSuccess().setVisible(true);//取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jTextFiled1.getText()); Atm.FileWriter(); } if(a%100!=0||a>5000){ new AtmWithdrawlInputError().setVisible(true);//取款金額輸入錯誤界面 this.setVisible(false); } else{ new AtmBalanceNotEnough().setVisible(true);//余額不足 this.setVisible(false); } } “取消”按鈕的鼠標事件代碼: private void jButton13MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//返回到主交易界面 this.setVisible(false);} 9)存款界面 和取款界面類似,具體的代碼如下所示: 100,300,500,1000,2000按鈕的鼠標事件代碼: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true);//存款成功界面 this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton1.getText()); Atm.FileWriter();} private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton3.getText()); Atm.FileWriter();} private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton5.getText()); Atm.FileWriter();} private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton4.getText()); Atm.FileWriter();} private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton6.getText()); Atm.FileWriter();} “其他面額”按鈕的鼠標事件代碼: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositInput().setVisible(true);//輸入存款金額界面 this.setVisible(false);} 10)輸入存款金額界面 和存款界面2類似,具體的事件代碼如下: “確定”按鈕的鼠標事件點擊代碼: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String cs=jTextField1.getText(); if(Double.valueOf(cs)%100==0&&Double.valueOf(cs)>0){ new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(cs); Atm.FileWriter();} else{new AtmDepositInputError().setVisible(true);//存款金額輸入錯誤界面 this.setVisible(false); } } 11)密碼修改界面 本來修改密碼是要輸入原密碼的,但我們在使用ATM時,一開始就輸入了密碼,否則也不能進入修改密碼界面,所以在這里直接輸入新密碼,連續兩次輸入,且兩次輸入的密碼相同,且6位密碼不完全相同,則修改密碼成功,否則失敗,具體代碼如下: “確定”按鈕的鼠標事件代碼: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String a=jPasswordField1.getText(); Atm.password1=a; new AtmPasswordInAgain().setVisible(true);//進入密碼確認界面 this.setVisible(false);} “返回”按鈕的鼠標事件代碼: private void jButton10MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true); this.setVisible(false);} 12)密碼修改確認界面 第二次輸入新密碼,具體代碼如下: “確定”按鈕的鼠標事件代碼: private boolean Samechars(String str)//若6位密碼相同,則返回false { if(str.equals(”000000“)==true || str.equals(”111111“)==true || str.equals(”222222“)==true || str.equals(”333333“)==true || str.equals(”444444“)==true || str.equals(”555555“)==true || str.equals(”666666“)==true || str.equals(”777777“)==true || str.equals(”888888“)==true || str.equals(”999999")==true) return true; else return false;} private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String b= jPasswordField1.getText(); Atm.password2=b; int i = jPasswordField1.getText().length(); if(i== 6 && Atm.password1.equals(b)&& Samechars(b)==false) { Atm.thePassword = b; Atm.FileWriter(); new AtmPasswordChangeSuccess().setVisible(true);//進入修改成功界面 this.setVisible(false); } else { new AtmPasswordUnsucc().setVisible(true);//進入失敗界面 this.setVisible(false);} } 13)密碼修改成功界面 當兩次輸入的密碼相同,則彈出密碼修改成功界面,點擊“繼續”按鈕返回到主交易界面,退出系統則點擊“退卡”按鈕。代碼略。14)密碼修改失敗界面 點擊“確定”按鈕,則返回到修改密碼界面,若放棄修改點擊“退卡”按鈕,若還想進行其他交易,則點擊“確定”后,再點擊修改密碼界面的“返回”按鈕。 “確定”按鈕的鼠標點擊事件代碼: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmPasswordChange().setVisible(true);//返回到密碼修改界面 this.setVisible(false);} 15)存款成功界面 點擊“繼續”則返回到主交易界面,“退出”則退出交易。16)存款失敗界面 當所存金額不是100的整數時,則存款失敗,同樣點擊“返回”按鈕則返回到主交易界面,點擊“退卡”則退出交易。17)取款成功界面 當索取金額不大于5000,且是100的整數,當前余額不小于索取金額時,則取款成功。 18)取款失敗界面(余額不足) 當輸入的金額大于當前余額,輸入的金額不大于5000且是100的倍數,則彈出余額不足界面。19)取款失敗界面(輸入金額錯誤) 當輸入的金額不是100的倍數且大于5000時,出現此界面。 五、參考文獻 《Java應用案例教程》張紅梅,姜曉剛等著 清華大學出版社 六、心得體會 在這次的期中課程設計中,我主要運用了Java語言的圖形用戶界面設計、異常處理、Swing控件,輸入輸出流等,綜合運用了Java語言。我深刻感受到了面向對象語言中類庫的強大功能,掌握了運用Java中的類實現某些基本功能,在完成設計的同時培養了自己的編程思維,為以后做別的設計打下基礎。 剛開始做ATM機課程設計的時候,我簡直一點頭緒也沒有,我想著自己編程一直都那么差,怎么可能完成這么難的設計,但是這是期中考試設計,肯定得交啊,所以我不得不圖書館借書看,邊看邊做,在做的過程中,我才知道java不只是寫代碼,還有許多其他的功能,我發現我對專業課不像以前那么的排斥了,還有感覺通過自己查詢相關書籍去實踐以及和同學交流獲取的知識更鞏固,我不再那么討厭編程了,我覺得無論什么事情,只要自己愿意去嘗試,并且盡自己最大努力去做,總會有所收獲的。本來一直認為這門專業對女生來說學起來很吃力,很困難,但是現在又有了信心,差的人可以付出更多的努 力去彌補自己的不足,這樣就可以不被落下了。在以后的學習中,我會更加努力,我覺得java學習一定要理論與實踐相結合,才能更好地掌握知識。 黃 淮 學 院 JAVA 課程設計報告 題 目: 《ATM柜員機》課程設計 學 院: 信 息 工 程 學 院 專 業: 計算機科學與技術 指導老師: 二0一三年六月 目錄 課程設計過程概述.......................................................................................3 2 課程設計題目描述和基本設計要求...........................................................3 3 系統需求分析...............................................................................................3 3.1 功能需求分析···················································································· 3 3.2 其他需求分析···················································································· 4 4 系統設計........................................................................................................4 4.1 總體設計 ··························································································· 4 4.2 ATM柜員機界面設計 ········································································· 5 4.3 各功能模塊設計 ················································································ 7 4.3.1 登陸頁面模塊設計 ····························································· 7 4.3.2 選擇服務模塊設計 ····························································· 8 4.3.3 取款模塊設計 ····································································· 9 4.3.4 修改密碼模塊設計 ····························································· 9 4.3.5 退卡模塊設計 ··································································· 10 4.4 異常處理情況說明 ·········································································· 10 5 系統實現與測試.........................................................................................11 6 課程設計總結.............................................................................................13 6.1 遇到的問題及解決辦法 ·································································· 13 6.2 心得體會 ························································································· 14 參考文獻..........................................................................................................15 附錄..................................................................................................................15 ATM初始賬號:000000 初始密碼:123456 ATM柜員機 課程設計過程概述 2013年6月,JAVA課程設計在1#樓六樓機房進行,持續時間為兩周。這次課程設計的主要目的是結合面向對象程序設計課程,培養我們面向對象軟件開發的思維,初步了解軟件開發的一般流程,提高用JAVA編程的實際動手能力并增強大家對面向對象的了解。這次課程設計的主要內容是獨立用JAVA語言開發一個小的應用程序。我們開發了一個ATM柜員機。課程設計題目描述和基本設計要求 我設計的ATM柜員機主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機的要求。3 系統需求分析 3.1 功能需求分析 本ATM柜員機的主要功能如下所述: 要求使用圖形用戶界面。當輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統能登錄ATM柜員機系統,用戶可 以按照以下規則進行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數,總額不超過5000元,支取金額不允許透支。? ATM存款:不能出現負存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。 3.2 其他需求分析(1)性能描述 實時性好、靈活性強、易于不同年齡階段的人操作。(2)設計約束 開發工具:MyEclipse 運行環境:Windows XP、Window 7 能實現用戶所定義的各項需求。(3)界面要求 以Windows窗口形式顯示,標題欄為ATM柜員機名稱,右上角有最小化按鈕、最大化按鈕、關閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。4 系統設計 4.1 總體設計 我所設計的ATM柜員機主要是由登錄頁面模塊還由選擇服務模塊組 成,其中選擇服務模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結構圖如下所示: 圖1 ATM功能結構示意圖 4.2 ATM柜員機界面設計 我們覺得一個系統的界面應該要簡單明了,當然樣式美觀就更好了。我設計的界面主要是由窗體組成,操作簡單。而每一個窗口則執行相應的功能。 一個系統界面的好壞直接影響到用戶的操作,界面設計要求樣式美觀、簡單明了、方便易操作。我設計的界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執行相應的操作。(1)窗體的設計 窗體整個框架使用Frame類構造,Frame有自己的外邊框和自己的標題,創建Frame時可以指定其窗口標題,我創建的窗口標題是各個不 同功能的模塊的名字,比如說查詢余額,還有取款等。相應源代碼為: 向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”);p1.add(button1);this.add(p1);每個Frame在其右上角都有三個控制圖標,分別代表將窗口最小化、窗口最大化和關閉的操作,其中最小化和最大化操作Frame可自動完成,而關閉窗口操作實現需要書寫有關的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應,調用dispose()方法關閉窗口。Frame也可以引發WindowsEvent類代表的窗口事件。相應源代碼為: addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關閉事件 { System.exit(0);} });}(2)窗體的主要結構的設計 我所設計的窗口的主要結構的特點就是每個窗口都對應著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務等,所以它們都是由各種按鈕和文本框,標簽組成的,而聯系各個窗體成為一個整體的就是各個按鈕的監聽事件。所以整個設計就趨向簡單化了。 為了定義各個按鈕所對應的命令和操作,首先需要將各個按鈕注冊給實現了動作事件的監聽接口ActionListener的監聽者,然后為監聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。4.3 各功能模塊設計 4.3.1 登陸頁面模塊設計 與ATM柜員機打交道比較多的,也是大家對安全比較關心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續服務。我定義了文本框類的對象tf1,tf2。是用于輸入單行的文本;文本區調用public String getPassword()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關掉窗口。此模塊相應的部分源代碼為: public void actionPerformed(ActionEvent e){ Account act;act=new Account(“000000”,“HuangHuai”,“123456”,50000);//初始化 /*選擇各種服務*/ 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(“選擇服務”,act);}else{ JOptionPane.showMessageDialog(this, “密碼或帳號錯誤!”,“賬戶提 示信息”,JOptionPane.ERROR_MESSAGE); dispose(); new WindowBox(“ATM”); } } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } 4.3.2 選擇服務模塊設計 在選擇服務模塊中,有各種ATM的服務功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應的界面。每一個按鈕都有監聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數e,監視器就會知道所發生的事件,對此事件進行處理。其中的部分源代碼為: p.add(new Label(“請選擇你要的服務”)); this.add(p);/*各種服務功能*/ 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 取款模塊設計 在取款模塊中,和其他的界面也是同樣的結構。也是有一個文本框和一個按鈕還有標簽組成的。用戶在文本框中輸入他想取的數額,但是必須是100的倍數,而且每一次最多只能取5000塊。當然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負,否則就會彈出報錯的窗口。其方法為: public String withdrawMoney(double money){ String str = null; if(money<=0){ str = “取款數目須是正數!”;}else{ if(getMoney()<0){//判斷余額是否為負 str=“余額為負數!”; }else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取錢數為100的倍數或不大于5000 str= “取款數目須是一百的整數倍!”; }else{ setBalance(money); str = “取款成功:余額為”+getMoney(); } }else{ str = “余額不足!”; } } return str;} 4.3.4 修改密碼模塊設計 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會報錯。再一個就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會報錯,然后再重新回到修改密碼的界面。在修改密碼時用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判斷兩次輸入的新密碼是個匹配 act.changePassword(pwd3);//啟用新的密碼 dispose(); JOptionPane.showMessageDialog(this, “修改密碼成功!”); new Selection(“選擇”,act);//返回選擇服務窗口 }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 退卡模塊設計 在退卡模塊設計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==buttonTUI){//退出 System.exit(0); dispose(); } 這個方法就可以實現了,這里就不再多說了。4.4 異常處理情況說明 (1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數據庫訪問時的異常處理 需要處理的異常:SQLException (3)加載類時的異常處理 需要處理的異常:ClassNotFindException,當應用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。(4)加載URL時的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現了錯誤的 URL。或者在規范字符串中找不到任何合法協議,或者無法分析字符串。5 系統實現與測試 (1)打開MyEclipse,編譯運行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報下圖的錯誤。 圖2 主界面—登陸頁面 (2)選擇服務界面效果 當輸入的密碼和卡號正確,單擊確定后就會進入到選擇服務的界面,如圖3所示。然后就可以選擇所需要的服務了。 圖3 選擇服務界面 (3)取款界面,如圖4所示。 圖4 取款界面 當輸入的錢數不是100的倍數或每一次大于5000時就會報圖5的錯誤。 圖5 輸入錯誤 當取款時如果超過卡里的余額的話就會報圖6的錯誤。 圖6 輸入錯誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 (5)修改密碼界面,如下圖所示。 經過測試,所有的功能基本上都實現了,而且運行正常。6 課程設計總結 6.1 遇到的問題及解決辦法 在此次課程設計中,我遇到了一些問題,如:對于面向對象的方法了解不夠透徹,運用到實際的軟件開發中存在著困難;對于Java語言,只學習到了一些最基本的知識,這導致編寫程序時經常出現一些語法錯誤,而且要在短時間內用Java語言來設計一個具體的系統是一個較大的挑戰;還有對于正規開發一個系統的流程不熟悉,適應起來比 較慢,編寫各個模塊相對應的操作時,自己感覺難以動手,這表明所學的知識不能靈活運用到實際中。 對于以上的問題,自己有清楚的認識,解決辦法是需要大量閱讀相關的書籍,對于書上以及網站上下載的資料中的Java實例必須有清楚的理解,還有就是多跟精通此方面的老師和同學交流,取其精華。對于實際動手能力與系統開發的流程的適應,必須多進行實際的練習與操作,才能有大的進步。6.2 心得體會 在這次的學課程設計中,我主要運用了Java語言的界面設計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運用了Java語言。我深刻感受到了面向對象語言中類庫的強大功能,掌握了運用Java中的類實現某些基本功能,并學會了自己查詢使用類的方法,為以后的面向對象語言的自學奠定了基礎。 通過這兩個禮拜的課程設計我真的學到了很多的東西,當然這也和我的同學的幫助是離不開的。好了,下面就談一下我在這些天的體會吧: 在這次的課程設計中,主要是運用JAVA語言來編寫一個小的應用程序,當然還可以用其他的技術來輔助了。在這個小應用程序當中,我用了Java外還用了Swing控件。輸入輸出流等技術。由于以前學的不是很扎實,而且還有些知識我們都是沒有學過的,這就要求我們去查相關的書籍,還有就是和同學之間的交流。正因為這樣,才鍛煉了我的自學的能力,還有就是加深了我對各個知識點的認識,并且提高了我對專業的學習的興趣,為我以后的學習打下了基礎。此外,我還 感受到了面向對象語言的類庫的強大的功能,掌握了運用JAVA中的類實現某些基本功能,并學會了自己查詢使用類的方法,也就是要會用API文檔,為以后更好的學習面向對象語言奠定了基礎。通過將近兩周的努力,這次課程設計終于結束了,在這個過程當中,我學到了很多的知識,同時也感謝我的同學的幫助和指導。在以后的學習當中,我會更加努力的學習好專業知識,并將所學的知識用于實踐當中去,以便牢固掌握知識。參考文獻 [1] 王萌,劉婧,來賓著.JAVA程序設計[M]北京 冶金工業出版社,2004 [2] 黃聰明 精通 JAVA2程序設計[M]北京:清華大學出版社,2004.4 [3] 王文濤,袁海燕 JAVA實用程序設計100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設計[M]北京:清華大學出版社,2006.8 [5] 劉寶林 JAVA程序設計與案例[M]北京:高等教育出版社,2006.11 附錄 Account類: package cn.com.account;/** * 帳戶 * 該類為實現客戶信息及部分功能 */ 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;} /** * 得到剩余的錢的數目 */ 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”; } /** * 取款設置 * 若成功顯示余額 * 不成功顯示提示信息 */ public String withdrawMoney(double money){ String str = null;if(money<=0){ str = “取款數目須是正數!”;}else{ if(getMoney()<0){//判斷余額是否為負 str=“余額為負數!”;}else if(money<=getMoney()){ if((money%100!=0)||(money>=5000)){//取錢數為100的倍數 str= “取款數目須是一百的整數倍!”;}else{ setBalance(money);str = “取款成功:余額為”+getMoney();} 或不大于5000 }else{ str = “余額不足!”;} } return str;} /** * 存款設置 * 若成功顯示余額 * 不成功顯示提示信息 */ public String depositMoney(double money){ } String str = null; if(money<0){ str =“存款數目須是正數!”;}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);/** * 窗口事件, 判斷窗口是否關閉 */ 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);//返回選擇服務窗口 }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){//構造函數 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(“請輸入你想取錢的數目”));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 = ”取款數目不能為空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.withdrawMoney(money); JOptionPane.showMessageDialog(this, str,”取款提示信息“,JOptionPane.PLAIN_MESSAGE); } this.setVisible(false);new Selection(”選擇服務“,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){//構造函數 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(”選擇服務“,act);//返回選擇服務窗口 } 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(”請選擇你要的服務“));this.add(p);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(” 修改密碼 “);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){//構造函數 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(”請輸入你想存款的數目“));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 = ”存款數目不能為空!“;}else{ } money = Double.parseDouble(tf.getText().toString());str = act.depositMoney(money); JOptionPane.showMessageDialog(this, str,”存款提示信息“,JOptionPane.INFORMATION_MESSAGE); } dispose();this.setVisible(false);new Selection(”選擇服務“,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){//構造方法 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());/*監聽器*/ 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);//初始化 /*選擇各種服務*/ 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(”選擇服務“,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");} } 湖南科技大學計算機科學與工程學院 數據庫課程設計報告 題目:人事管理管理系統 學 號:1005030221 姓 名:艾向兵 指導教師:張黎 完成時間:2012年1月4日 組員:蘇勇,成佳裕,艾向兵 企業人事管理系統主要用于員工個人資料的錄入,職務變動的記錄和管理。使用人事管理系統,便于公司領導掌握人員的動向,及時調整人才的分配 1.1系統功能需求分析 人事管理系統主要有以下幾項功能要求:.新員工資料的輸入。 .自動分配員工編號,并且設置初始的用戶密碼:.人事變動的記載,包括崗位和部門的調整。.員工信息的查詢和修改,包括員工個人信息和密碼 1.2 系統功能模塊設計 根據系統功能要求,可以將系統分解成幾個模塊來分別設計應用程序界面,如圖,人事資源管理 包括:新員工檔案輸入,人事變更,員工檔案查詢 1.3 與其它系統的關系 本關系是公司管理信息系統的基礎部分,為其他子系統,如考勤管理系統,工資管理系統和員工培訓系統,提供員工的基本信息。同時為其他系統提供了員工登錄的密碼認證和權限分配。1.4數據庫設計 數據庫需求分析: 員工信息:員工號,密碼,權限,姓名,性別,生日,專業,通訊地址,電話,Email,當前狀態,其他。 人事變動:記錄號,員工,變動,詳細描述 部門設置:部門編號,名稱 員工變動代號表 員工信息表 員工職位代碼表 管理員登陸界面 信息查詢,修改,刪除主界面 查詢單個員工的界面 總 結 這次的課程設計,是在學習了Java以后通過閱讀課本及在圖書館借閱相關書籍同嚴景、孟珍三人共同完成的。在開發這個系統的過程中,碰到很多或大或小的問題,我們一起思考,一起努力,最后大部分都解決了,得到了現在的這個簡單的人事管理系統。 在編制過程中,我們首先考慮到了界面的友好性,并在界面設計時不采用煩瑣的細節,使界面簡單、清晰,便于操作。一開始我們是想做個登錄界面,實現用戶的登錄權限管理,但試了幾次都沒有達到預期的效果,最后不得不放棄。 通過這次課程設計,我知道了什么事情都不那么簡單,只有努力去做了,你才會有收獲,不管收獲大小,付出的過程總是有的。有些事情只有親身感受,你才知道它的價值有多大。同時在遇到困難的時候要沉著冷靜,首先要冷靜分析問題,對于很難解決的問題要學會請教他人,還可以與別人合作。 在這次數據庫系統課程設計中,我主要進行的是界面的設計,以及進行進行整合操作,界面是我學習Java以來第一次做,以前不怎么用的JTabel等,現在都已經熟練的應用了,特別是這次的彈出窗口,我在做這個的時候可謂是一竅不通,因為把按鈕JButton定義為了局部變量而在時間響應中而得不到另一個窗口的彈出。 還有就是在整個過程中的ID傳遞讓我不知怎么辦,一個簡單的參數傳遞才得以搞定,基礎知識還是不夠牢靠。在得到修改表的數據庫內容后未把值傳給表格。 雖然這次課程設計付出了大量的時間,但是我知道我得到的收獲遠遠不是這些時間可以衡量的,它將給我今后的學習和工作帶來更多的收益。通過對此課題的開發,使我對用Java開發系統有了一個比較清楚的認識,體會到理論和實踐的重要性。由于自己的分析設計和程序經驗不足,該系統設計和實現過程中,還有許多沒有完善的地方,比如沒有設置登錄界面,沒有考慮到異常等多方面問題,這些都有待進一步完善和提高。對于文中出現的不足和系統中出現的問題敬請老師指導。 彈出登錄程序的界面程序 public void actionPerformed(ActionEvent e){ if(e.getSource()==okButton){ String userID=text.getText();String passWD=String.valueOf(passwd.getPassword());if(userID.equals(“1”)&&passWD.equals(“1”)){ JOptionPane.showMessageDialog(null, “登陸成功!”, “消息”, JOptionPane.INFORMATION_MESSAGE); new UserWindow2().userWindow2();//彈出第二個窗體 } else{ JOptionPane.showMessageDialog(null, “對不起您的用戶名或密碼錯誤!”, “錯誤”,JOptionPane.ERROR_MESSAGE); text.setText(“");passwd.setText(”“);} } if(e.getSource()==deleButton){ text.setText(”“);passwd.setText(”“);} } 進行信息查詢,修改,刪除的程序響應代碼: public void actionPerformed(ActionEvent e){ if(e.getSource()==button1){ new UserWindow3(); } if(e.getSource()==button2){ UserWindow7 u= new UserWindow7();u.userWindow7();} if(e.getSource()==button3){ UserWindow5 u=new UserWindow5(); u.userWindow5();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ int id= Integer.parseInt(text0.getText());//得到用戶編號 String name=text1.getText();//得到用戶姓名 String sex=text2.getText();//得到性別 String birthDay=text3.getText();//得到生日 String department=text4.getText();//得到所在部門 String job =text5.getText();//得到職位 String education=text6.getText();//得到教育程度 String spcialty=text7.getText();//專業技能 String address=text8.getText();//得到地址 String tel=text9.getText();//得到電話 String email=text10.getText();//得到電子郵箱 String state=text11.getText();//得到員工狀態 String remark=text12.getText();//得到備注 Insert in=new Insert();// boolean b; b=in.insert(id,name,sex,birthDay,department,job,education,spcialty,address,tel,email,state,remark);if(b){ JOptionPane.showMessageDialog(null, ”數據保存成功!“, ”消息“, JOptionPane.INFORMATION_MESSAGE);} } } public void actionPerformed(ActionEvent e){ // TODO Auto-generated method stub id = Integer.parseInt(text.getText()); if(e.getSource()==button){ UserWindow8 us = new UserWindow8();us.userWindow8(id); } Container container=this.getContentPane();container.setLayout(new BorderLayout()); JPanel pan =new JPanel();JLabel lab = new JLabel(”請輸入工號:“);JTextField text=new JTextField(10);JButton button =new JButton(”查詢“);JButton button1=new JButton(”刪除“);pan.add(lab);pan.add(text);pan.add(button);pan.add(button1);container.add(pan); String []titles={”員工編號“,”姓名“,”性別“,”生日“,”部門“,”職務“,”教育程度“,”專業技能“,”家庭住址“,”聯系電話“,”電子郵箱"}; String [][]userInfo={}; JTable table =new JTable(userInfo,titles);table.isCellEditable(2,2);JScrollPane scrollpane =new JScrollPane(taboooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......................le); container.add(scrollpane,BorderLayout.SOUTH);第二篇:JAVA課程設計-ATM機模擬系統
第三篇:Java期中課程設計(ATM機)報告
第四篇:ATM取款機java課程設計
第五篇:人事管理系統Java課程設計報告