第一篇:Java期中課程設(shè)計(jì)(ATM機(jī))報(bào)告
Java期中課程設(shè)計(jì)報(bào)告
報(bào)告題目:ATM模擬程序
姓名:
學(xué)號(hào):2009118246 學(xué)院:信息科學(xué)與技術(shù)學(xué)院
專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)
一、課程設(shè)計(jì)目的和內(nèi)容
目的:課程設(shè)計(jì)的主要目的是結(jié)合面向?qū)ο蟪绦蛟O(shè)計(jì)課程,培養(yǎng)面向?qū)ο筌浖_發(fā)的思維,初步了解軟件開發(fā)的一般流程,提高用JAVA編程的實(shí)際動(dòng)手能力并增強(qiáng)大家對(duì)面向?qū)ο蟮牧私狻?/p>
內(nèi)容:設(shè)計(jì)ATM取款機(jī)主要包括登錄頁(yè)面、選擇服務(wù)、存款、取款、查詢余額、修改密碼和退出等功能。注:各種按鈕的事件和功能簡(jiǎn)單模擬ATM取款機(jī)的要求。
二、系統(tǒng)需求分析
1、功能需求分析(1)模擬ATM柜員機(jī)程序;
(2)修改密碼。當(dāng)用戶需要修改密碼時(shí),可以用這個(gè)功能,新密碼長(zhǎng)度不小于6位,不允許出現(xiàn)6位完全相同的情況,只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。(3)取款。用戶根據(jù)自己需要取多少錢,輸入要取的金額,每次取款金額為100的倍數(shù),總額不超過(guò)5000元,支取金額不允許透支。(4)查詢余額。用戶需要知道自己帳戶還剩多少錢時(shí),可以查詢自己帳戶的余額。
(5)存款。用戶可以存款,金額為100的倍數(shù),不能出現(xiàn)負(fù)存款。(6)鎖機(jī)。當(dāng)用戶3次輸入密碼錯(cuò)誤時(shí),停止操作。
2、設(shè)計(jì)需求分析
A界面設(shè)計(jì)簡(jiǎn)潔、友好、美觀大方。B操作簡(jiǎn)單、快捷方便。
C信息分類清晰、準(zhǔn)確。3.ATM功能模塊圖
4、約束條件(1)設(shè)計(jì)工具
開發(fā)工具:NetBeans 運(yùn)行環(huán)境:Windows 7(2)界面要求
以Windows窗口形式顯示,標(biāo)題欄為ATM自動(dòng)取款機(jī)不同的窗口中有不同的按鈕和選擇菜單。
三、系統(tǒng)設(shè)計(jì)
1、功能結(jié)構(gòu)模塊圖
我們所設(shè)計(jì)的ATM柜員機(jī)主要是由登錄頁(yè)面模塊還由選擇服務(wù)模塊組成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結(jié)構(gòu)圖如下所示:
2、業(yè)務(wù)流程圖
四、詳細(xì)設(shè)計(jì)
1、界面設(shè)計(jì)概述
我設(shè)計(jì)的ATM機(jī),主要應(yīng)用java圖形用戶界面開發(fā)的知識(shí),在netbeans上根據(jù)要求來(lái)創(chuàng)建窗體,窗體整個(gè)框架使用JFrame類構(gòu)造,JFrame有自己的外邊框和自己的標(biāo)題,創(chuàng)建JFrame時(shí)可以指定其窗口標(biāo)題,在創(chuàng)建窗口時(shí),好多代碼是自動(dòng)生成,我只是在其基礎(chǔ)上添加一些約束條件的代碼,比如說(shuō)每次輸入的取款金額必須為100的整數(shù),當(dāng)密碼輸入三次錯(cuò)誤,便鎖卡等代碼需要自己編寫,這里我會(huì)主要說(shuō)明自己編寫的那部分代碼,也是程序中比較重要的部分,其中有許多Swing組件重復(fù)應(yīng)用,代碼相同,在報(bào)告中不重復(fù)說(shuō)明,比如說(shuō)數(shù)字“0-9”的代碼,“退卡”按鈕的代碼等。
1、各模塊界面設(shè)計(jì)與程序設(shè)計(jì)
主模塊設(shè)計(jì):
主函數(shù)中定義了6個(gè)靜態(tài)變量:密碼(thePassword),余額(balance),新密碼1(password1),新密碼2(password2),其中密碼為String類型,余額是double型,計(jì)數(shù)器(counter),用來(lái)記密碼的輸入次數(shù),整型,初始化為0,dataStr是String類型,初始化為空字符串,還定義了FileWriter()和FileReader()方法分別用來(lái)寫和讀ATM在交易中的余額和密碼也就是dataStr,使用戶的余額和密碼變成變化后的值。在主方法中首先要調(diào)用一次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();//調(diào)用讀文件
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)待機(jī)界面
這個(gè)界面可以說(shuō)是一個(gè)待機(jī)界面,點(diǎn)擊“插卡”按鈕,進(jìn)入登陸界面,其過(guò)程相當(dāng)于ATM讀取磁卡信息的過(guò)程,利用了Swing控件中的標(biāo)簽和按鈕,在“插卡”按鈕添加鼠標(biāo)點(diǎn)擊事件代碼如下:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmEnter().setVisible(true);//進(jìn)入登陸界面
this.setVisible(false);}
2)登陸界面
這個(gè)登陸界面,用戶名和賬號(hào)在插卡時(shí)相當(dāng)于系統(tǒng)已經(jīng)讀取,所以下面這個(gè)界面只是密碼驗(yàn)證,輸入正確的密碼,若正確,則進(jìn)入主交易界面,若錯(cuò)誤則進(jìn)入密碼錯(cuò)誤,重新輸入,若輸入3次錯(cuò)誤,則進(jìn)入鎖卡界面,具體界面和程序代碼如下所示:
“確定”按鈕的鼠標(biāo)點(diǎn)擊事件代碼(用戶三次輸入錯(cuò)誤判斷程序):
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);
}
}
“數(shù)字0-9”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
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“);}
“退卡”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton10MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmWelcome().setVisible(true);//返回到待機(jī)界面
this.setVisible(false);}
“更正”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
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)主交易界面
這個(gè)界面分別設(shè)計(jì)了“查詢余額”按鈕,“取款”按鈕,“修改密碼”按鈕等,點(diǎn)擊時(shí)分別進(jìn)入相應(yīng)的功能界面,具體代碼如下所示:“查詢余額”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmAccountBalance().setVisible(true);//進(jìn)入顯示余額界面
this.setVisible(false);}
“取款”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton4MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmWithdrawl().setVisible(true);//進(jìn)入取款界面
this.setVisible(false);}
“存款”的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton3MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmDeposit().setVisible(true);//進(jìn)入存款界面
this.setVisible(false);}
“修改密碼”的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton6MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmPasswordChange().setVisible(true);//進(jìn)入密碼修改界面
this.setVisible(false);}
4)密碼錯(cuò)誤界面
當(dāng)在登錄界面登陸時(shí),若密碼錯(cuò)誤則出現(xiàn)密碼錯(cuò)誤界面,這個(gè)界面上點(diǎn)擊“繼續(xù)” 按鈕則返回到登陸界面重新輸入密碼,具體代碼如下: “繼續(xù)”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton2MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmEnter().setVisible(true);//返回到登陸界面
this.setVisible(false);}
5)鎖卡界面
密碼輸錯(cuò)3次,卡鎖,代碼見登陸界面的“確定”按鈕點(diǎn)擊事件代碼。6)余額查詢界面
點(diǎn)擊“繼續(xù)”則返回到主交易界面,具體的代碼如下: 顯示余額的代碼:
public AtmAccountBalance(){
initComponents();
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
setVisible(true);
}
});
jLabel1.setText(”當(dāng)前余額:“+ Atm.balance);
Atm.FileWriter();} “繼續(xù)”按鈕的鼠標(biāo)點(diǎn)擊代碼如下:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmEnterSuccess().setVisible(true);//進(jìn)入主交易界面
this.setVisible(false);}
7)取款界面
取款界面規(guī)定單次最多取款5000元,若所取金額在界面上有,則直接點(diǎn)擊相應(yīng)按鈕,若沒有,則點(diǎn)擊“其他面額”按鈕,然后輸入自己想取得面額,具體事件代碼如下:
100,300,500,1000,2000按鈕的鼠標(biāo)點(diǎn)擊事件代碼如下:
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);//進(jìn)入取款成功界面
this.setVisible(false);
Atm.balance=Atm.balance-Double.valueOf(jButton1.getText());
Atm.FileWriter();}
else{ new AtmBalanceNotEnough().setVisible(true);//進(jìn)入余額不足界面
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);//進(jìn)入取款成功界面
this.setVisible(false);
Atm.balance=Atm.balance-Double.valueOf(jButton3.getText());
Atm.FileWriter();}
else{ new AtmBalanceNotEnough().setVisible(true);//進(jìn)入余額不足界面
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);//進(jìn)入取款成功界面
this.setVisible(false);
Atm.balance=Atm.balance-Double.valueOf(jButton5.getText());
Atm.FileWriter();}
else{ new AtmBalanceNotEnough().setVisible(true);//進(jìn)入余額不足界面
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);//進(jìn)入取款成功界面
this.setVisible(false);
Atm.balance=Atm.balance-Double.valueOf(jButton4.getText());
Atm.FileWriter();}
else{ new AtmBalanceNotEnough().setVisible(true);//進(jìn)入余額不足界面
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);//進(jìn)入取款成功界面
this.setVisible(false);
Atm.balance=Atm.balance-Double.valueOf(jButton6.getText());
Atm.FileWriter();}
else{ new AtmBalanceNotEnough().setVisible(true);//進(jìn)入余額不足界面
this.setVisible(false);
} }
“其他面額”按鈕鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton2MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmWithdrawlInput().setVisible(true);//輸入取款金額界面
this.setVisible(false);}
“返回”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton7MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmEnterSuccess().setVisible(true);//返回主交易界面
this.setVisible(false);}
8)取款金額輸入界面
這個(gè)界面是當(dāng)用戶所想取得金額在界面上沒有的時(shí)候,便需要用戶自己輸入,規(guī)定輸入的金額必須是100的倍數(shù),且不大于5000元,具體事件代碼如下所示:(其中按鈕0-9的代碼,“退卡”按鈕等的代碼和前面相同)
“確定”按鈕的鼠標(biāo)事件代碼:
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);//取款金額輸入錯(cuò)誤界面
this.setVisible(false);
}
else{
new AtmBalanceNotEnough().setVisible(true);//余額不足
this.setVisible(false);
}
}
“取消”按鈕的鼠標(biāo)事件代碼:
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按鈕的鼠標(biāo)事件代碼:
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();}
“其他面額”按鈕的鼠標(biāo)事件代碼:
private void jButton2MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmDepositInput().setVisible(true);//輸入存款金額界面
this.setVisible(false);}
10)輸入存款金額界面
和存款界面2類似,具體的事件代碼如下: “確定”按鈕的鼠標(biāo)事件點(diǎn)擊代碼:
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);//存款金額輸入錯(cuò)誤界面
this.setVisible(false);
} }
11)密碼修改界面
本來(lái)修改密碼是要輸入原密碼的,但我們?cè)谑褂肁TM時(shí),一開始就輸入了密碼,否則也不能進(jìn)入修改密碼界面,所以在這里直接輸入新密碼,連續(xù)兩次輸入,且兩次輸入的密碼相同,且6位密碼不完全相同,則修改密碼成功,否則失敗,具體代碼如下: “確定”按鈕的鼠標(biāo)事件代碼:
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);//進(jìn)入密碼確認(rèn)界面
this.setVisible(false);}
“返回”按鈕的鼠標(biāo)事件代碼:
private void jButton10MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmEnterSuccess().setVisible(true);
this.setVisible(false);}
12)密碼修改確認(rèn)界面
第二次輸入新密碼,具體代碼如下: “確定”按鈕的鼠標(biāo)事件代碼:
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);//進(jìn)入修改成功界面
this.setVisible(false);
}
else
{ new AtmPasswordUnsucc().setVisible(true);//進(jìn)入失敗界面
this.setVisible(false);}
} 13)密碼修改成功界面
當(dāng)兩次輸入的密碼相同,則彈出密碼修改成功界面,點(diǎn)擊“繼續(xù)”按鈕返回到主交易界面,退出系統(tǒng)則點(diǎn)擊“退卡”按鈕。代碼略。14)密碼修改失敗界面
點(diǎn)擊“確定”按鈕,則返回到修改密碼界面,若放棄修改點(diǎn)擊“退卡”按鈕,若還想進(jìn)行其他交易,則點(diǎn)擊“確定”后,再點(diǎn)擊修改密碼界面的“返回”按鈕。
“確定”按鈕的鼠標(biāo)點(diǎn)擊事件代碼:
private void jButton2MouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
new AtmPasswordChange().setVisible(true);//返回到密碼修改界面
this.setVisible(false);}
15)存款成功界面
點(diǎn)擊“繼續(xù)”則返回到主交易界面,“退出”則退出交易。16)存款失敗界面
當(dāng)所存金額不是100的整數(shù)時(shí),則存款失敗,同樣點(diǎn)擊“返回”按鈕則返回到主交易界面,點(diǎn)擊“退卡”則退出交易。17)取款成功界面
當(dāng)索取金額不大于5000,且是100的整數(shù),當(dāng)前余額不小于索取金額時(shí),則取款成功。
18)取款失敗界面(余額不足)
當(dāng)輸入的金額大于當(dāng)前余額,輸入的金額不大于5000且是100的倍數(shù),則彈出余額不足界面。19)取款失敗界面(輸入金額錯(cuò)誤)
當(dāng)輸入的金額不是100的倍數(shù)且大于5000時(shí),出現(xiàn)此界面。
五、參考文獻(xiàn)
《Java應(yīng)用案例教程》張紅梅,姜曉剛等著
清華大學(xué)出版社
六、心得體會(huì)
在這次的期中課程設(shè)計(jì)中,我主要運(yùn)用了Java語(yǔ)言的圖形用戶界面設(shè)計(jì)、異常處理、Swing控件,輸入輸出流等,綜合運(yùn)用了Java語(yǔ)言。我深刻感受到了面向?qū)ο笳Z(yǔ)言中類庫(kù)的強(qiáng)大功能,掌握了運(yùn)用Java中的類實(shí)現(xiàn)某些基本功能,在完成設(shè)計(jì)的同時(shí)培養(yǎng)了自己的編程思維,為以后做別的設(shè)計(jì)打下基礎(chǔ)。
剛開始做ATM機(jī)課程設(shè)計(jì)的時(shí)候,我簡(jiǎn)直一點(diǎn)頭緒也沒有,我想著自己編程一直都那么差,怎么可能完成這么難的設(shè)計(jì),但是這是期中考試設(shè)計(jì),肯定得交啊,所以我不得不圖書館借書看,邊看邊做,在做的過(guò)程中,我才知道java不只是寫代碼,還有許多其他的功能,我發(fā)現(xiàn)我對(duì)專業(yè)課不像以前那么的排斥了,還有感覺通過(guò)自己查詢相關(guān)書籍去實(shí)踐以及和同學(xué)交流獲取的知識(shí)更鞏固,我不再那么討厭編程了,我覺得無(wú)論什么事情,只要自己愿意去嘗試,并且盡自己最大努力去做,總會(huì)有所收獲的。本來(lái)一直認(rèn)為這門專業(yè)對(duì)女生來(lái)說(shuō)學(xué)起來(lái)很吃力,很困難,但是現(xiàn)在又有了信心,差的人可以付出更多的努
力去彌補(bǔ)自己的不足,這樣就可以不被落下了。在以后的學(xué)習(xí)中,我會(huì)更加努力,我覺得java學(xué)習(xí)一定要理論與實(shí)踐相結(jié)合,才能更好地掌握知識(shí)。
第二篇:JAVA課程設(shè)計(jì)報(bào)告ATM存取款系統(tǒng)
目 錄
1課程設(shè)計(jì)題目描述和基本設(shè)計(jì)要求...............................................................2 系統(tǒng)需求分析..................................................................................................2.1 功能需求分析 ······················································································
2.2 其他需求分析 ······················································································
3系統(tǒng)設(shè)計(jì)...........................................................................................................3.1 總體設(shè)計(jì) ······························································································
3.2 ATM柜員機(jī)界面設(shè)計(jì) ·········································································
3.3 各功能模塊設(shè)計(jì) ··················································································
3.3.1 登陸頁(yè)面模塊設(shè)計(jì) ································································
3.3.2 選擇服務(wù)模塊設(shè)計(jì) ································································
3.3.3 取款模塊設(shè)計(jì) ·······································································
3.3.4 退卡模塊設(shè)計(jì) ······································································· 3.4 異常處理情況說(shuō)明 ·································································· 系統(tǒng)實(shí)現(xiàn)與測(cè)試..............................................................................................5總程序...............................................................................................................6 課程設(shè)計(jì)總結(jié)..................................................................................................6.1 遇到的問題及解決辦法 ······································································
6.2 心得體會(huì) ······························································································
ATM柜員機(jī) 課程設(shè)計(jì)題目描述和基本設(shè)計(jì)要求
ATM柜員機(jī)主要是由各個(gè)Windows窗口組成,它是由登錄頁(yè)面、選擇服務(wù)、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡(jiǎn)單的模擬ATM柜員機(jī)的要求。系統(tǒng)需求分析 2.1 功能需求分析
主要功能如下所述:
要求使用圖形用戶界面。當(dāng)輸入給定的卡號(hào)和密碼(初始卡號(hào)為000000和密碼為123456)時(shí),系統(tǒng)能登錄ATM柜員機(jī)系統(tǒng),用戶可以按照以下規(guī)則進(jìn)行:
? 查詢余額:初始余額為50000元
? ATM取款:每次取款金額為100的倍數(shù),總額不超過(guò)5000元,支取金額不允許透支。
? ATM存款:不能出現(xiàn)負(fù)存款。
? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。
2.2 其他需求分析
(1)性能描述
實(shí)時(shí)性好、靈活性強(qiáng)、易于不同年齡階段的人操作。(2)設(shè)計(jì)約束
開發(fā)工具:JCrator ProV3.5.0 運(yùn)行環(huán)境:Windows 2000以上 能實(shí)現(xiàn)用戶所定義的各項(xiàng)需求。(3)界面要求
以Windows窗口形式顯示,標(biāo)題欄為ATM柜員機(jī)名稱,右上角有最小化按鈕、最大化按鈕、關(guān)閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。系統(tǒng)設(shè)計(jì) 3.1 總體設(shè)計(jì)
我所設(shè)計(jì)的ATM柜員機(jī)主要是由登錄頁(yè)面模塊還由選擇服務(wù)模塊組成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結(jié)構(gòu)圖如下所示:
圖1
ATM功能結(jié)構(gòu)示意圖
3.2 ATM柜員機(jī)界面設(shè)計(jì)
一個(gè)系統(tǒng)界面的好壞直接影響到用戶的操作,界面設(shè)計(jì)要求樣式美觀、簡(jiǎn)單明了、方便易操作。界面主要分為窗體、菜單、按鈕和文本輸入框幾個(gè)部分,分別執(zhí)行相應(yīng)的操作。
(1)窗體的設(shè)計(jì)
窗體整個(gè)框架使用Frame類構(gòu)造,F(xiàn)rame有自己的外邊框和自己的標(biāo)題,創(chuàng)建Frame時(shí)可以指定其窗口標(biāo)題,我創(chuàng)建的窗口標(biāo)題是各個(gè)不同功能的模塊的名字,比如說(shuō)查詢余額,還有取款等。相應(yīng)源代碼為:WindowBox(String s,Account act){super(“ATM柜員機(jī)”);}、Selection(String s,Account act){ } super(s);向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”);
p1.add(button1);this.add(p1);每個(gè)Frame在其右上角都有三個(gè)控制圖標(biāo),分別代表將窗口最小化、窗口最大化和關(guān)閉的操作,其中最小化和最大化操作Frame可自動(dòng)完成,而關(guān)閉窗口操作實(shí)現(xiàn)需要書寫有關(guān)的代碼,在我的程序中我采用的是對(duì)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è)計(jì)
我所設(shè)計(jì)的窗口的主要結(jié)構(gòu)的特點(diǎn)就是每個(gè)窗口都對(duì)應(yīng)著一個(gè)特定的功能。比如說(shuō)報(bào)各種各樣的錯(cuò),還有各種查詢余額、取款、選擇服務(wù)等,所以它們都是由各種按鈕和文本框,標(biāo)簽組成的,而聯(lián)系各個(gè)窗體成為一個(gè)整體的就是各個(gè)按鈕的監(jiān)聽事件。所以整個(gè)設(shè)計(jì)就趨向簡(jiǎn)單化了。
為了定義各個(gè)按鈕所對(duì)應(yīng)的命令和操作,首先需要將各個(gè)按鈕注冊(cè)給實(shí)現(xiàn)了動(dòng)作事件的監(jiān)聽接口ActionListener的監(jiān)聽者,然后為監(jiān)聽者定義actionPerformed(ActionEvent e)方法,在這個(gè)方法中調(diào)用e.getSource()或e.getActionCommand()來(lái)判斷用戶點(diǎn)擊的菜單子項(xiàng),并完成這個(gè)菜單子項(xiàng)定義的操作。
3.3 各功能模塊設(shè)計(jì) 3.3.1 登陸頁(yè)面模塊設(shè)計(jì)
與ATM柜員機(jī)打交道比較多的,也是大家對(duì)安全比較關(guān)心的問題:密碼。所以第一個(gè)界面就是要輸入密碼和卡號(hào)才能繼續(xù)服務(wù)。
我定義了文本框累的對(duì)象tf1,tf2。抓藥是用于輸入單行的文本;文本區(qū)調(diào)用public String getText()方法,獲取用戶想要的字符串。用來(lái)判斷輸入的密碼和卡號(hào)是否正確,如果不正確的話,則彈出密碼或卡號(hào)錯(cuò)誤的警告框,并用dispose()關(guān)掉窗口。
3.3.2 選擇服務(wù)模塊設(shè)計(jì)
在選擇服務(wù)模塊中,有各種ATM的服務(wù)功能,只要用戶在該界面中選擇按鈕,它就會(huì)彈出各個(gè)相應(yīng)的界面。每一個(gè)按鈕都有監(jiān)聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創(chuàng)建一個(gè)事件對(duì)象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數(shù)e,監(jiān)視器就會(huì)知道所發(fā)生的事件,對(duì)此事件進(jìn)行處理。
3.3.3 取款模塊設(shè)計(jì)
在取款模塊中,和其他的界面也是同樣的結(jié)構(gòu)。也是有一個(gè)文本框和一個(gè)按鈕還有標(biāo)簽組成的。用戶在文本框中輸入他想取的數(shù)額,但是必須是100的倍數(shù),而且每一次最多只能取5000塊。當(dāng)然了取款的時(shí)候也不能超過(guò)卡里的余額,再就是卡里的余額不可以為負(fù),否則就會(huì)彈出報(bào)錯(cuò)的窗口。3.3.4 退卡模塊設(shè)計(jì)
在退卡模塊設(shè)計(jì)中,這個(gè)方法就更加的簡(jiǎn)單了,它只是用了if(e.getSource()==button4){//退出
} System.exit(0);dispose();這個(gè)方法就可以實(shí)現(xiàn)了,這里就不再多說(shuō)了。
3.4 異常處理情況說(shuō)明
(1)打開、保存文件時(shí)的異常處理 需要處理的異常:IOException(2)數(shù)據(jù)庫(kù)訪問時(shí)的異常處理 需要處理的異常:SQLException(3)加載類時(shí)的異常處理
需要處理的異常:ClassNotFindException,當(dāng)應(yīng)用程序試圖使用Class類中的forName方法通過(guò)字符串名加載類時(shí),但是沒有找到具有指定名稱的類的定義。
(4)加載URL時(shí)的異常
需要處理的異常:MalformedURLException,拋出這一異常指示出現(xiàn)了錯(cuò)誤的 URL?;蛘咴谝?guī)范字符串中找不到任何合法協(xié)議,或者無(wú)法分析字符串。系統(tǒng)實(shí)現(xiàn)與測(cè)試
(1)編譯運(yùn)行程序后,將會(huì)看到如下的界面,如圖2所示。如果輸入的密碼或卡號(hào)不正確的話就會(huì)報(bào)右下圖的錯(cuò)誤。
圖2 主界面—登陸頁(yè)面
(2)選擇服務(wù)界面效果
當(dāng)輸入的密碼和卡號(hào)正確,單擊確定后就會(huì)進(jìn)入到選擇服務(wù)的界面,如圖3所示。然后就可以選擇所需要的服務(wù)了。
圖3 選擇服務(wù)界面
(3)取款界面,如圖4所示。
圖4 取款界面
(4)查詢余額界面,如圖7所示。
圖7 查詢余額界面
圖8 存款界面
圖9 轉(zhuǎn)賬界面
經(jīng)過(guò)測(cè)試,所有的功能基本上都實(shí)現(xiàn)了,而且運(yùn)行正常。.總程序
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(“
”+“銀行存取款系統(tǒng)”);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(“用戶取款系統(tǒng)”);
}} 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(“請(qǐng)輸入卡號(hào):”);label1=new JLabel(“請(qǐng)輸入密碼:”);
label3=new
JLabel();label4=new
JLabel(“
請(qǐng)
輸
入
驗(yàn)
證”);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“);
//設(shè)置賬號(hào)123456789的初始密碼為112626,每輸入一次都有提示,在連續(xù)輸入三次不正確后系統(tǒng)自動(dòng)退出。
”);}
if(e.getActionCommand().equals(“確定”))
if(panel1.textC.getText().equals(panel1.label3.getText())){
heshi();
}
else{JOptionPane.showMessageDialog(frame,“你輸入的驗(yàn)證碼有誤,請(qǐng)重新輸入。
else if(e.getActionCommand()==”取消“){this.setVisible(false);new Client08(”“);}
}
public void heshi(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
請(qǐng)輸入賬號(hào)、密碼!“);return;} try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數(shù)據(jù)庫(kù) 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(”用戶取款系統(tǒng)“);
}else{ if(i!=2){i++;j=3-i;
JOptionPane.showMessageDialog(frame,”密碼有誤!你還有“+j+”次機(jī)會(huì),請(qǐng)你再仔細(xì)想想.“);
panel1.textA.setText(”“);}
else {JOptionPane.showMessageDialog(frame,”對(duì)不起,你輸入的密碼次數(shù)達(dá)三次,下次再見?!?;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(”用戶取款系統(tǒng)“);
}} 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(“轉(zhuǎn)賬”);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(”請(qǐng)選擇取款金額“);
}
else if(e.getActionCommand()==”查詢“){
this.setVisible(false);
new Client06(”查詢服務(wù)“);
}
else if(e.getActionCommand()==”存款“){
this.setVisible(false);
new Client05(”請(qǐng)選擇存款金額“);
}
else if(e.getActionCommand()==”轉(zhuǎn)賬“){
this.setVisible(false);
new Client04(”用戶轉(zhuǎn)賬服務(wù)“);
}
else if(e.getActionCommand()==”退出“){ this.setVisible(false);new Client08(”“);}
} } class Selectfunction{
public static void main(String []args){
new Client01(”用戶取款系統(tǒng)“);
new Client01(”用戶存款系統(tǒng)“);
} } 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(”繼續(xù)“);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(”繼續(xù)“)){
this.setVisible(false);
new Client01(”選擇服務(wù)種類“);
}
else if(e.getActionCommand()==”查詢“)showcjine();
}
public void showcjine(){
//String
url
=
”jdbc:odbc:driver={Microsoft
Access
Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當(dāng)前類目錄下的數(shù)據(jù)庫(kù)文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數(shù)據(jù)庫(kù) 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(”用戶查詢服務(wù)“);
}} 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(”用戶查詢服務(wù)“);
}
else if(e.getActionCommand()==”查本卡信息“){ this.setVisible(false);
new Client07(”本卡信息“);
} } } class Searchinformation{
public static void main(String []args){
new Client06(”查詢服務(wù)“);
} } package ZDC;//轉(zhuǎn)賬功能
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(”輸入預(yù)轉(zhuǎn)賬號(hào):“);label2=new JLabel(”輸入預(yù)轉(zhuǎn)金額:“);
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();//程序根據(jù)輸入賬號(hào)調(diào)用數(shù)據(jù)庫(kù),修改對(duì)應(yīng)金額數(shù)。
this.setVisible(false);
new Client01(”用戶取款系統(tǒng)“);
}
else if(e.getActionCommand()==”取消“){
this.setVisible(false);
new Client01(”用戶取款系統(tǒng)“);}
}
public void zhuanzhang(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
請(qǐng)輸入欲轉(zhuǎn)賬號(hào)、金額!“);return;} //String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當(dāng)前類目錄下的數(shù)據(jù)庫(kù)文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數(shù)據(jù)庫(kù) 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(”用戶取款系統(tǒng)“); } else{JOptionPane.showMessageDialog(null,” 請(qǐng)重新輸入金額!“,”警告!“, 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(”用戶轉(zhuǎn)賬服務(wù)“);}} 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; 該用戶不存在,請(qǐng)重新輸入?!?“ 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();//程序根據(jù)輸入金額和輸入卡號(hào),修改數(shù)據(jù)庫(kù)。 new Client01(”用戶取款系統(tǒng)“); } else if(e.getActionCommand()==”200“){ else if(e.getActionCommand()==”300“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統(tǒng)“);} this.setVisible(false); qukuan(); new Client01(”用戶取款系統(tǒng)“);} else if(e.getActionCommand()==”500“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統(tǒng)“);} else if(e.getActionCommand()==”800“){ this.setVisible(false); qukuan(); new Client01(”用戶取款系統(tǒng)“);} else if(e.getActionCommand()==”1000“){ } public void qukuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數(shù)據(jù)庫(kù) Statement sql=con.createStatement();String ql=Panel01.textB.getText(); this.setVisible(false); qukuan(); new Client01(”用戶取款系統(tǒng)“);} 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(”用戶取款系統(tǒng)“); } else{JOptionPane.showMessageDialog(null,” 你的卡余額已不足,請(qǐng)注意!“,”警告!“, 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(”請(qǐng)選擇取款金額“); } } this.setVisible(false);new Client01(”用戶取款系統(tǒng)“);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();//程序根據(jù)輸入金額和輸入卡號(hào),修改數(shù)據(jù)庫(kù)。 new Client01(”用戶存款系統(tǒng)“); } else if(e.getActionCommand()==”200“){this.setVisible(false);new Client01(”用戶存款系統(tǒng)“);} //這里當(dāng)點(diǎn)擊取款金額200時(shí),程序返回上層操作界面。 } public void cunkuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//連接數(shù)據(jù)庫(kù) 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(”用戶存款系統(tǒng)“); } else{JOptionPane.showMessageDialog(null,” 請(qǐng)注意!“,”警告!“, JOptionPane.YES_NO_OPTION); this.setVisible(false);new Client01(”用戶取款系統(tǒng)“);} 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(”請(qǐng)選擇存款金額“); } } 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(”顯示卡號(hào):“); 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(”用戶取款系統(tǒng)“); } } public void showCard(){ String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用當(dāng)前類目錄下的數(shù)據(jù)庫(kù)文件 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(”提示退出對(duì)話框“);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{ 謝謝使用,請(qǐng)?jiān)?0秒內(nèi)退出 JLabel());add(new JLabel());add(new public void main(String []args){ new Client08(”提示退出對(duì)話框"); } } 6課程設(shè)計(jì)總結(jié) 6.1 遇到的問題及解決辦法 在此次課程設(shè)計(jì)中,我遇到了一些問題,如:對(duì)于面向?qū)ο蟮姆椒私獠粔蛲笍?,運(yùn)用到實(shí)際的軟件開發(fā)中存在著困難;對(duì)于Java語(yǔ)言,只學(xué)習(xí)到了一些最基本的知識(shí),這導(dǎo)致編寫程序時(shí)經(jīng)常出現(xiàn)一些語(yǔ)法錯(cuò)誤,而且要在短時(shí)間內(nèi)用Java語(yǔ)言來(lái)設(shè)計(jì)一個(gè)具體的系統(tǒng)是一個(gè)較大的挑戰(zhàn)。對(duì)于以上的問題,自己有清楚的認(rèn)識(shí),解決辦法是需要大量閱讀相關(guān)的書籍,對(duì)于書上以及網(wǎng)站上下載的資料中的Java實(shí)例必須有清楚的理解。對(duì)于實(shí)際動(dòng)手能力與系統(tǒng)開發(fā)的流程的適應(yīng),必須多進(jìn)行實(shí)際的練習(xí)與操作,才能有大的進(jìn)步。 6.2 心得體會(huì) 在這次的課程設(shè)計(jì)中,我主要運(yùn)用了Java語(yǔ)言的界面設(shè)計(jì)、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運(yùn)用了Java語(yǔ)言。我深刻感受到了面向?qū)ο笳Z(yǔ)言中類庫(kù)的強(qiáng)大功能,掌握了運(yùn)用Java中的類實(shí)現(xiàn)某些基本功能,并學(xué)會(huì)了自己查詢使用類的方法,為以后的面向?qū)ο笳Z(yǔ)言的自學(xué)奠定了基礎(chǔ)。在以后的學(xué)習(xí)當(dāng)中,我會(huì)更加努力的學(xué)習(xí)好專業(yè)知識(shí),并將所學(xué)的知識(shí)用于實(shí)踐當(dāng)中去,以便牢固掌握知識(shí)。 黃 淮 學(xué) 院 JAVA 課程設(shè)計(jì)報(bào)告 題 目: 《ATM柜員機(jī)》課程設(shè)計(jì) 學(xué) 院: 信 息 工 程 學(xué) 院 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 指導(dǎo)老師: 二0一三年六月 目錄 課程設(shè)計(jì)過(guò)程概述.......................................................................................3 2 課程設(shè)計(jì)題目描述和基本設(shè)計(jì)要求...........................................................3 3 系統(tǒng)需求分析...............................................................................................3 3.1 功能需求分析···················································································· 3 3.2 其他需求分析···················································································· 4 4 系統(tǒng)設(shè)計(jì)........................................................................................................4 4.1 總體設(shè)計(jì) ··························································································· 4 4.2 ATM柜員機(jī)界面設(shè)計(jì) ········································································· 5 4.3 各功能模塊設(shè)計(jì) ················································································ 7 4.3.1 登陸頁(yè)面模塊設(shè)計(jì) ····························································· 7 4.3.2 選擇服務(wù)模塊設(shè)計(jì) ····························································· 8 4.3.3 取款模塊設(shè)計(jì) ····································································· 9 4.3.4 修改密碼模塊設(shè)計(jì) ····························································· 9 4.3.5 退卡模塊設(shè)計(jì) ··································································· 10 4.4 異常處理情況說(shuō)明 ·········································································· 10 5 系統(tǒng)實(shí)現(xiàn)與測(cè)試.........................................................................................11 6 課程設(shè)計(jì)總結(jié).............................................................................................13 6.1 遇到的問題及解決辦法 ·································································· 13 6.2 心得體會(huì) ························································································· 14 參考文獻(xiàn)..........................................................................................................15 附錄..................................................................................................................15 ATM初始賬號(hào):000000 初始密碼:123456 ATM柜員機(jī) 課程設(shè)計(jì)過(guò)程概述 2013年6月,JAVA課程設(shè)計(jì)在1#樓六樓機(jī)房進(jìn)行,持續(xù)時(shí)間為兩周。這次課程設(shè)計(jì)的主要目的是結(jié)合面向?qū)ο蟪绦蛟O(shè)計(jì)課程,培養(yǎng)我們面向?qū)ο筌浖_發(fā)的思維,初步了解軟件開發(fā)的一般流程,提高用JAVA編程的實(shí)際動(dòng)手能力并增強(qiáng)大家對(duì)面向?qū)ο蟮牧私?。這次課程設(shè)計(jì)的主要內(nèi)容是獨(dú)立用JAVA語(yǔ)言開發(fā)一個(gè)小的應(yīng)用程序。我們開發(fā)了一個(gè)ATM柜員機(jī)。課程設(shè)計(jì)題目描述和基本設(shè)計(jì)要求 我設(shè)計(jì)的ATM柜員機(jī)主要是由各個(gè)Windows窗口組成,它是由登錄頁(yè)面、選擇服務(wù)、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡(jiǎn)單的模擬ATM柜員機(jī)的要求。3 系統(tǒng)需求分析 3.1 功能需求分析 本ATM柜員機(jī)的主要功能如下所述: 要求使用圖形用戶界面。當(dāng)輸入給定的卡號(hào)和密碼(初始卡號(hào)為000000和密碼為123456)時(shí),系統(tǒng)能登錄ATM柜員機(jī)系統(tǒng),用戶可 以按照以下規(guī)則進(jìn)行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數(shù),總額不超過(guò)5000元,支取金額不允許透支。? ATM存款:不能出現(xiàn)負(fù)存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。 3.2 其他需求分析(1)性能描述 實(shí)時(shí)性好、靈活性強(qiáng)、易于不同年齡階段的人操作。(2)設(shè)計(jì)約束 開發(fā)工具:MyEclipse 運(yùn)行環(huán)境:Windows XP、Window 7 能實(shí)現(xiàn)用戶所定義的各項(xiàng)需求。(3)界面要求 以Windows窗口形式顯示,標(biāo)題欄為ATM柜員機(jī)名稱,右上角有最小化按鈕、最大化按鈕、關(guān)閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。4 系統(tǒng)設(shè)計(jì) 4.1 總體設(shè)計(jì) 我所設(shè)計(jì)的ATM柜員機(jī)主要是由登錄頁(yè)面模塊還由選擇服務(wù)模塊組 成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。其功能結(jié)構(gòu)圖如下所示: 圖1 ATM功能結(jié)構(gòu)示意圖 4.2 ATM柜員機(jī)界面設(shè)計(jì) 我們覺得一個(gè)系統(tǒng)的界面應(yīng)該要簡(jiǎn)單明了,當(dāng)然樣式美觀就更好了。我設(shè)計(jì)的界面主要是由窗體組成,操作簡(jiǎn)單。而每一個(gè)窗口則執(zhí)行相應(yīng)的功能。 一個(gè)系統(tǒng)界面的好壞直接影響到用戶的操作,界面設(shè)計(jì)要求樣式美觀、簡(jiǎn)單明了、方便易操作。我設(shè)計(jì)的界面主要分為窗體、菜單、按鈕和文本輸入框幾個(gè)部分,分別執(zhí)行相應(yīng)的操作。(1)窗體的設(shè)計(jì) 窗體整個(gè)框架使用Frame類構(gòu)造,F(xiàn)rame有自己的外邊框和自己的標(biāo)題,創(chuàng)建Frame時(shí)可以指定其窗口標(biāo)題,我創(chuàng)建的窗口標(biāo)題是各個(gè)不 同功能的模塊的名字,比如說(shuō)查詢余額,還有取款等。相應(yīng)源代碼為: 向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”);p1.add(button1);this.add(p1);每個(gè)Frame在其右上角都有三個(gè)控制圖標(biāo),分別代表將窗口最小化、窗口最大化和關(guān)閉的操作,其中最小化和最大化操作Frame可自動(dòng)完成,而關(guān)閉窗口操作實(shí)現(xiàn)需要書寫有關(guān)的代碼,在我的程序中我采用的是對(duì)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è)計(jì) 我所設(shè)計(jì)的窗口的主要結(jié)構(gòu)的特點(diǎn)就是每個(gè)窗口都對(duì)應(yīng)著一個(gè)特定的功能。比如說(shuō)報(bào)各種各樣的錯(cuò),還有各種查詢余額、取款、選擇服務(wù)等,所以它們都是由各種按鈕和文本框,標(biāo)簽組成的,而聯(lián)系各個(gè)窗體成為一個(gè)整體的就是各個(gè)按鈕的監(jiān)聽事件。所以整個(gè)設(shè)計(jì)就趨向簡(jiǎn)單化了。 為了定義各個(gè)按鈕所對(duì)應(yīng)的命令和操作,首先需要將各個(gè)按鈕注冊(cè)給實(shí)現(xiàn)了動(dòng)作事件的監(jiān)聽接口ActionListener的監(jiān)聽者,然后為監(jiān)聽者定義actionPerformed(ActionEvent e)方法,在這個(gè)方法中調(diào)用e.getSource()或e.getActionCommand()來(lái)判斷用戶點(diǎn)擊的菜單子項(xiàng),并完成這個(gè)菜單子項(xiàng)定義的操作。4.3 各功能模塊設(shè)計(jì) 4.3.1 登陸頁(yè)面模塊設(shè)計(jì) 與ATM柜員機(jī)打交道比較多的,也是大家對(duì)安全比較關(guān)心的問題:密碼。所以第一個(gè)界面就是要輸入密碼和卡號(hào)才能繼續(xù)服務(wù)。我定義了文本框類的對(duì)象tf1,tf2。是用于輸入單行的文本;文本區(qū)調(diào)用public String getPassword()方法,獲取用戶想要的字符串。用來(lái)判斷輸入的密碼和卡號(hào)是否正確,如果不正確的話,則彈出密碼或卡號(hào)錯(cuò)誤的警告框,并用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;//輸入的兩個(gè)卡號(hào)和密碼的變量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判斷兩次輸入的卡號(hào)和密碼是否正確*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(number2))){ dispose(); new Selection(“選擇服務(wù)”,act);}else{ JOptionPane.showMessageDialog(this, “密碼或帳號(hào)錯(cuò)誤!”,“賬戶提 示信息”,JOptionPane.ERROR_MESSAGE); dispose(); new WindowBox(“ATM”); } } if(e.getSource()==button2){ System.exit(0); dispose();//退出 } } 4.3.2 選擇服務(wù)模塊設(shè)計(jì) 在選擇服務(wù)模塊中,有各種ATM的服務(wù)功能,只要用戶在該界面中選擇按鈕,它就會(huì)彈出各個(gè)相應(yīng)的界面。每一個(gè)按鈕都有監(jiān)聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創(chuàng)建一個(gè)事件對(duì)象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數(shù)e,監(jiān)視器就會(huì)知道所發(fā)生的事件,對(duì)此事件進(jìn)行處理。其中的部分源代碼為: p.add(new Label(“請(qǐng)選擇你要的服務(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è)計(jì) 在取款模塊中,和其他的界面也是同樣的結(jié)構(gòu)。也是有一個(gè)文本框和一個(gè)按鈕還有標(biāo)簽組成的。用戶在文本框中輸入他想取的數(shù)額,但是必須是100的倍數(shù),而且每一次最多只能取5000塊。當(dāng)然了取款的時(shí)候也不能超過(guò)卡里的余額,再就是卡里的余額不可以為負(fù),否則就會(huì)彈出報(bào)錯(cuò)的窗口。其方法為: 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è)計(jì) 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會(huì)報(bào)錯(cuò)。再一個(gè)就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會(huì)報(bào)錯(cuò),然后再重新回到修改密碼的界面。在修改密碼時(shí)用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(pwd1)){ if(pwd3.equals(pwd4)){//判斷兩次輸入的新密碼是個(gè)匹配 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, “輸入密碼錯(cuò)誤,更新密碼失敗!”); new Selection(“選擇”,act);} } 4.3.5 退卡模塊設(shè)計(jì) 在退卡模塊設(shè)計(jì)中,這個(gè)方法就更加的簡(jiǎn)單了,它只是用了if(e.getSource()==buttonTUI){//退出 System.exit(0); dispose(); } 這個(gè)方法就可以實(shí)現(xiàn)了,這里就不再多說(shuō)了。4.4 異常處理情況說(shuō)明 (1)打開、保存文件時(shí)的異常處理 需要處理的異常:IOException(2)數(shù)據(jù)庫(kù)訪問時(shí)的異常處理 需要處理的異常:SQLException (3)加載類時(shí)的異常處理 需要處理的異常:ClassNotFindException,當(dāng)應(yīng)用程序試圖使用Class類中的forName方法通過(guò)字符串名加載類時(shí),但是沒有找到具有指定名稱的類的定義。(4)加載URL時(shí)的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現(xiàn)了錯(cuò)誤的 URL?;蛘咴谝?guī)范字符串中找不到任何合法協(xié)議,或者無(wú)法分析字符串。5 系統(tǒng)實(shí)現(xiàn)與測(cè)試 (1)打開MyEclipse,編譯運(yùn)行程序后,將會(huì)看到如下的界面,如圖2所示。如果輸入的密碼或卡號(hào)不正確的話就會(huì)報(bào)下圖的錯(cuò)誤。 圖2 主界面—登陸頁(yè)面 (2)選擇服務(wù)界面效果 當(dāng)輸入的密碼和卡號(hào)正確,單擊確定后就會(huì)進(jìn)入到選擇服務(wù)的界面,如圖3所示。然后就可以選擇所需要的服務(wù)了。 圖3 選擇服務(wù)界面 (3)取款界面,如圖4所示。 圖4 取款界面 當(dāng)輸入的錢數(shù)不是100的倍數(shù)或每一次大于5000時(shí)就會(huì)報(bào)圖5的錯(cuò)誤。 圖5 輸入錯(cuò)誤 當(dāng)取款時(shí)如果超過(guò)卡里的余額的話就會(huì)報(bào)圖6的錯(cuò)誤。 圖6 輸入錯(cuò)誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 (5)修改密碼界面,如下圖所示。 經(jīng)過(guò)測(cè)試,所有的功能基本上都實(shí)現(xiàn)了,而且運(yùn)行正常。6 課程設(shè)計(jì)總結(jié) 6.1 遇到的問題及解決辦法 在此次課程設(shè)計(jì)中,我遇到了一些問題,如:對(duì)于面向?qū)ο蟮姆椒私獠粔蛲笍?,運(yùn)用到實(shí)際的軟件開發(fā)中存在著困難;對(duì)于Java語(yǔ)言,只學(xué)習(xí)到了一些最基本的知識(shí),這導(dǎo)致編寫程序時(shí)經(jīng)常出現(xiàn)一些語(yǔ)法錯(cuò)誤,而且要在短時(shí)間內(nèi)用Java語(yǔ)言來(lái)設(shè)計(jì)一個(gè)具體的系統(tǒng)是一個(gè)較大的挑戰(zhàn);還有對(duì)于正規(guī)開發(fā)一個(gè)系統(tǒng)的流程不熟悉,適應(yīng)起來(lái)比 較慢,編寫各個(gè)模塊相對(duì)應(yīng)的操作時(shí),自己感覺難以動(dòng)手,這表明所學(xué)的知識(shí)不能靈活運(yùn)用到實(shí)際中。 對(duì)于以上的問題,自己有清楚的認(rèn)識(shí),解決辦法是需要大量閱讀相關(guān)的書籍,對(duì)于書上以及網(wǎng)站上下載的資料中的Java實(shí)例必須有清楚的理解,還有就是多跟精通此方面的老師和同學(xué)交流,取其精華。對(duì)于實(shí)際動(dòng)手能力與系統(tǒng)開發(fā)的流程的適應(yīng),必須多進(jìn)行實(shí)際的練習(xí)與操作,才能有大的進(jìn)步。6.2 心得體會(huì) 在這次的學(xué)課程設(shè)計(jì)中,我主要運(yùn)用了Java語(yǔ)言的界面設(shè)計(jì)、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運(yùn)用了Java語(yǔ)言。我深刻感受到了面向?qū)ο笳Z(yǔ)言中類庫(kù)的強(qiáng)大功能,掌握了運(yùn)用Java中的類實(shí)現(xiàn)某些基本功能,并學(xué)會(huì)了自己查詢使用類的方法,為以后的面向?qū)ο笳Z(yǔ)言的自學(xué)奠定了基礎(chǔ)。 通過(guò)這兩個(gè)禮拜的課程設(shè)計(jì)我真的學(xué)到了很多的東西,當(dāng)然這也和我的同學(xué)的幫助是離不開的。好了,下面就談一下我在這些天的體會(huì)吧: 在這次的課程設(shè)計(jì)中,主要是運(yùn)用JAVA語(yǔ)言來(lái)編寫一個(gè)小的應(yīng)用程序,當(dāng)然還可以用其他的技術(shù)來(lái)輔助了。在這個(gè)小應(yīng)用程序當(dāng)中,我用了Java外還用了Swing控件。輸入輸出流等技術(shù)。由于以前學(xué)的不是很扎實(shí),而且還有些知識(shí)我們都是沒有學(xué)過(guò)的,這就要求我們?nèi)ゲ橄嚓P(guān)的書籍,還有就是和同學(xué)之間的交流。正因?yàn)檫@樣,才鍛煉了我的自學(xué)的能力,還有就是加深了我對(duì)各個(gè)知識(shí)點(diǎn)的認(rèn)識(shí),并且提高了我對(duì)專業(yè)的學(xué)習(xí)的興趣,為我以后的學(xué)習(xí)打下了基礎(chǔ)。此外,我還 感受到了面向?qū)ο笳Z(yǔ)言的類庫(kù)的強(qiáng)大的功能,掌握了運(yùn)用JAVA中的類實(shí)現(xiàn)某些基本功能,并學(xué)會(huì)了自己查詢使用類的方法,也就是要會(huì)用API文檔,為以后更好的學(xué)習(xí)面向?qū)ο笳Z(yǔ)言奠定了基礎(chǔ)。通過(guò)將近兩周的努力,這次課程設(shè)計(jì)終于結(jié)束了,在這個(gè)過(guò)程當(dāng)中,我學(xué)到了很多的知識(shí),同時(shí)也感謝我的同學(xué)的幫助和指導(dǎo)。在以后的學(xué)習(xí)當(dāng)中,我會(huì)更加努力的學(xué)習(xí)好專業(yè)知識(shí),并將所學(xué)的知識(shí)用于實(shí)踐當(dāng)中去,以便牢固掌握知識(shí)。參考文獻(xiàn) [1] 王萌,劉婧,來(lái)賓著.JAVA程序設(shè)計(jì)[M]北京 冶金工業(yè)出版社,2004 [2] 黃聰明 精通 JAVA2程序設(shè)計(jì)[M]北京:清華大學(xué)出版社,2004.4 [3] 王文濤,袁海燕 JAVA實(shí)用程序設(shè)計(jì)100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設(shè)計(jì)[M]北京:清華大學(xué)出版社,2006.8 [5] 劉寶林 JAVA程序設(shè)計(jì)與案例[M]北京:高等教育出版社,2006.11 附錄 Account類: package cn.com.account;/** * 帳戶 * 該類為實(shí)現(xiàn)客戶信息及部分功能 */ public class Account { private String code = null;//信用卡號(hào) 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(){//取得卡號(hào) 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(“請(qǐng)輸入你的舊密碼:”));panel1.add(tf4);panel2.add(new Label(“請(qǐng)輸入你的新密碼:”));panel2.add(tf5);panel3.add(new Label(“請(qǐng)?jiān)俅屋斎胄旅艽a:”));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)){//判斷兩次輸入的新密碼是個(gè)匹配 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, ”輸入密碼錯(cuò)誤,更新密碼失更新密碼失敗!“);}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(“請(qǐng)輸入你想取錢的數(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(”請(qǐng)選擇你要的服務(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(”請(qǐng)輸入你想存款的數(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.*;/** * 登陸頁(yè)面首窗口 */ @SuppressWarnings(”serial“)public class WindowBox extends Frame implements ActionListener{ box1= Box.createVerticalBox();box1.add(new Label(”請(qǐng)輸入您的卡號(hào)“));//輸入卡號(hào) box1.add(Box.createVerticalStrut(8));box1.add(new Label(”請(qǐng)輸入您的密碼“));//輸入密碼 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;//輸入的兩個(gè)卡號(hào)和密碼的變量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword()); /*判斷兩次輸入的卡號(hào)和密碼是否正確*/ if((act.getCode().equals(number1))&&(act.getPassword().equals(num dispose();ber2))){ new Selection(”選擇服務(wù)“,act);}else{ JOptionPane.showMessageDialog(this, ”密碼或帳號(hào)錯(cuò)誤!“,”賬戶提示信息“,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 { /** * 主測(cè)試程序 * @param args */ public static void main(String[] args){ new WindowBox(”ATM");} } 課 程 設(shè) 計(jì) 課程名稱 Java語(yǔ)言課程設(shè)計(jì) 題目名稱 人事管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 學(xué)生學(xué)院 應(yīng)用數(shù)學(xué)學(xué)院 專業(yè)班級(jí) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 劉科峰 2014 年 10 月 29 日 一.設(shè)計(jì)內(nèi)容 自學(xué)Swing圖形界面設(shè)計(jì)和數(shù)據(jù)庫(kù)程序設(shè)計(jì)。開發(fā)用于某單位的人事管理系統(tǒng)。該系統(tǒng)要求實(shí)現(xiàn)以下功能: 1.員工信息管理包括:?jiǎn)T工信息一覽表、新員工的建立、修改 2.薪資福利管理:考勤與薪資的連動(dòng)計(jì)算、薪資與福利的設(shè)置 3.考勤假期管理:考勤項(xiàng)目錄入, 實(shí)現(xiàn)考勤信息的查詢、統(tǒng)計(jì)、匯總 4.人事報(bào)表管理:按照員工性別,數(shù)目,薪酬自動(dòng)生成相關(guān)報(bào)表, 可自定義統(tǒng)計(jì)分析條件并可對(duì)歷史報(bào)表進(jìn)行管理。 設(shè)計(jì)亮點(diǎn) 1.null布局方式 Swing圖形界面設(shè)計(jì)中有很多布局方式,通過(guò)本次學(xué)習(xí)了解到了FlowLayout,BorderLayout,GridLayout以及null布局,就這四種布局方式而言,null布局的優(yōu)點(diǎn)在于可以將組建的位置精準(zhǔn)到坐標(biāo)值,可以把組件放到任意想放置的位置,另外可以通過(guò)null去設(shè)置組件的大小,相較于其他布局方式來(lái)說(shuō)是一個(gè)很大的優(yōu)勢(shì)。但同時(shí)它的缺點(diǎn)在于不能根據(jù)Frame的大小變化而改變位置。 2.組件部分屬性的設(shè)計(jì) Swing中有很多方法是用來(lái)實(shí)現(xiàn)組件屬性設(shè)置的,比如button.setVisible(false);按鈕通過(guò)調(diào)用這個(gè)方法實(shí)現(xiàn)不可見,這是我此次課程設(shè)計(jì)中的一個(gè)亮點(diǎn),因?yàn)榻M件是沒有設(shè)置大小的方法的,只有依靠于相應(yīng)的布局方式才能改變它的大小,通過(guò)設(shè)置多幾個(gè)按鈕設(shè)為不可見,將所要可見按鈕實(shí)現(xiàn)大小以及位置的控制是一種很好的方法。 二、設(shè)計(jì)方案 1主界面(只列出界面設(shè)計(jì)方面的代碼) JPanel panel=new JPanel();JTable table=null;JButton ibtn=new JButton(“員工信息”);JButton cbtn=new JButton(“考勤管理”);JButton mbtn=new JButton(“薪資管理”);JButton tbtn=new JButton(“人事報(bào)表”);ImageIcon rtou = new ImageIcon(“rentou.jpg”); JLabel imgLabel=new JLabel(rtou); //上面代碼定義了一個(gè)面板與四個(gè)標(biāo)簽,并引入了一個(gè)圖片 panel.setLayout(new FlowLayout());//設(shè)置面板為流布局 panel.add(ibtn);panel.add(cbtn);panel.add(mbtn);panel.add(tbtn);panel.setBackground(Color.GRAY); //將按鈕加到面板中,設(shè)置面板為灰色 this.add(imgLabel,BorderLayout.CENTER);this.add(panel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*圖片標(biāo)簽以邊框布局放置在中間,將面板也以邊框布局放置在下面,可見,灰色,點(diǎn)擊關(guān)閉程序*/ (2)查詢員工界面(只列出界面設(shè)計(jì)方面的代碼) Label idlabel = new JLabel(“ID”);JLabel namelabel = new JLabel(“姓名”);JLabel bumenlabel = new JLabel(“部門”);JLabel zhiweilabel = new JLabel(“職位”); JTextField idfiled = new JTextField(8);JTextField namefield = new JTextField(8);JComboBox bumenbox =new JComboBox();JComboBox zhiweubox = new JComboBox(); JButton btn=new JButton(“查詢”);JButton ibtn=new JButton(“添加”) JPanel spanel=new JPanel();JPanel vpanel=new JPanel(); /*定義和各個(gè)組件,4個(gè)標(biāo)簽,兩個(gè)文本框,兩個(gè)復(fù)選框,兩個(gè)按鈕,兩個(gè)面板容器*/ spanel.setLayout(new FlowLayout()); vpanel.setLayout(new FlowLayout(FlowLayout.CENTER,45,25)); bumenbox.addItem(“"); bumenbox.addItem(”管理部“); bumenbox.addItem(”生產(chǎn)部“); bumenbox.addItem(”業(yè)務(wù)部“); zhiweubox.addItem(”“); zhiweubox.addItem(”部長(zhǎng)“); zhiweubox.addItem(”副部長(zhǎng)“); zhiweubox.addItem(”普工“); spanel.add(idlabel); spanel.add(idfiled); spanel.add(namelabel); spanel.add(namefield); spanel.add(bumenlabel); spanel.add(bumenbox); spanel.add(zhiweilabel); spanel.add(zhiweubox); spanel.add(btn); vpanel.add(ibtn); spanel.setBackground(Color.GRAY); vpanel.setBackground(Color.GRAY); //將各個(gè)組件放進(jìn)對(duì)應(yīng)面板,設(shè)置相關(guān)屬性 this.add(spanel,BorderLayout.NORTH); this.add(vpanel,BorderLayout.SOUTH); this.setBounds(300, 180, 600, 350); this.setVisible(true); this.getContentPane().setBackground(Color.GRAY); //將面板以邊框布局放入框架中,設(shè)置屬性(3)增加員工信息界面 JPanel panel=new JPanel(); JLabel timeLabel=new JLabel(”時(shí)間“);JLabel allnumLabel=new JLabel(”員工總數(shù)“); JLabel staffMoLabel=new JLabel(”考勤“);JLabel entryLabel=new JLabel(”全勤“); JLabel quitLabel=new JLabel(”缺勤“);JLabel mwLabel=new JLabel(”性別比例“); JLabel manLabel=new JLabel(”男“); JLabel womanLabel=new JLabel(”女“);JLabel proportionLabel=new JLabel(”男女比例“);JLabel distributionLabel=new JLabel(”人員部門分布“);JLabel mdpLabel=new JLabel(”管理部“); JLabel pdpLabel=new JLabel(”生產(chǎn)部“);JLabel bdpLabel=new JLabel(”業(yè)務(wù)部“);JLabel xmLabel=new JLabel(”項(xiàng)目“);JLabel xzLabel=new JLabel(”細(xì)則“);JLabel stLabel=new JLabel(”數(shù)據(jù)統(tǒng)計(jì)“); JTextField timeFiled = new JTextField(8); JTextField allnumFiled = new JTextField(8);JTextField entryFiled = new JTextField(8);JTextField quitFiled = new JTextField(8);JTextField manFiled = new JTextField(8);JTextField womanFiled = new JTextField(8);JTextField proportionFiled = new JTextField(8);JTextField mdpFiled = new JTextField(8);JTextField pdpFiled = new JTextField(8);JTextField bdpFiled = new JTextField(8);// 定義所需組件 public Selectrenshi(String tablename){ super(”人事管理“); panel.setLayout(null); panel.setBackground(Color.GRAY); panel.add(xmLabel); panel.add(xzLabel); panel.add(stLabel); panel.add(timeLabel); panel.add(timeFiled); panel.add(allnumLabel); panel.add(allnumFiled); panel.add(staffMoLabel); panel.add(entryLabel); panel.add(entryFiled); panel.add(quitLabel); panel.add(quitFiled); panel.add(mwLabel); panel.add(manLabel); panel.add(manFiled); panel.add(womanLabel); panel.add(womanFiled); panel.add(proportionLabel); panel.add(proportionFiled); panel.add(distributionLabel); panel.add(mdpLabel); panel.add(mdpFiled); panel.add(pdpLabel); panel.add(pdpFiled); panel.add(bdpLabel); panel.add(bdpFiled); //將組件加到相應(yīng)面板中 xmLabel.setBounds(120,20,100,30); xzLabel.setBounds(240,20,100,30); stLabel.setBounds(360,20,100,30); timeLabel.setBounds(120,50,100,30); timeFiled.setBounds(360,50,100,30); allnumLabel.setBounds(120,100,100,30); allnumFiled.setBounds(360,100,100,30); staffMoLabel.setBounds(120,150,100,30); entryLabel.setBounds(240,150,100,30); entryFiled.setBounds(360,150,100,30); quitLabel.setBounds(240,200,100,30); quitFiled.setBounds(360,200,100,30); mwLabel.setBounds(120,250,100,30); manLabel.setBounds(240,250,100,30); manFiled.setBounds(360,250,100,30); womanLabel.setBounds(240,300,100,30); womanFiled.setBounds(360,300,100,30); proportionLabel.setBounds(240,350,100,30); proportionFiled.setBounds(360,350,100,30); distributionLabel.setBounds(120,400,100,30); mdpLabel.setBounds(240,400,100,30); mdpFiled.setBounds(360,400,100,30); pdpLabel.setBounds(240,450,100,30); pdpFiled.setBounds(360,450,100,30); bdpLabel.setBounds(240,500,100,30); bdpFiled.setBounds(360,500,100,30); //采用null布局,設(shè)置組建坐標(biāo)值 this.add(panel,BorderLayout.CENTER); this.setBounds(300, 100, 600, 600); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().setBackground(Color.GRAY); //將面板放入框架,設(shè)置相應(yīng)屬性(4)員工考勤界面 JLabel idlabel = new JLabel(”ID“);JComboBox idbox =new JComboBox();CheckTable model = null; JButton wbtn=new JButton(”修改“); JButton cbtn=new JButton(”查詢“);JButton mbtn=new JButton(”創(chuàng)建薪資表“);JButton rbtn=new JButton(”創(chuàng)建人事表“); JScrollPane scrollpane = null;JPanel spanel=new JPanel();JPanel vpanel=new JPanel();JTable table=null;spanel.add(idbox);panel.add(wbtn);spanel.add(cbtn);vpanel.add(mbtn);vpanel.add(rbtn);spanel.setBackground(Color.GRAY);vpanel.setBackground(Color.GRAY);this.add(spanel,BorderLayout.NORTH);this.add(vpanel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY); (5)選擇考勤表界面 JLabel checklabel = new JLabel(”選擇考勤表“);JLabel newlabel = new JLabel(”創(chuàng)建考勤表“);JComboBox timebox =new JComboBox();JTextField newfield = new JTextField();JButton btn=new JButton(”確認(rèn)“);JButton nbtn=new JButton(”創(chuàng)建");JPanel spanel=new JPanel();spanel.add(checklabel); spanel.add(timebox); spanel.add(btn); spanel.add(newlabel); spanel.add(newfield); spanel.add(nbtn); checklabel.setBounds(30,90,100,30); timebox.setBounds(180,90,100,30); btn.setBounds(360,90,100,30); newlabel.setBounds(30,200,100,30); newfield.setBounds(180,200,100,30); nbtn.setBounds(360,200,100,30); this.add(spanel); this.setBounds(300, 180, 600, 350); this.setVisible(true); 三、結(jié)果和數(shù)據(jù)處理 四、結(jié)論 1.Swing圖形界面 圖形用戶界面(GUI)是程序不可或缺的一部分,它便于用戶和程序的交互。在Swing界面中是以Frame為框架,采用合理的布局方式(FlowLayout,BorderLayout,GridLayout,null),將Panel加入框架之中,而實(shí)現(xiàn)界面的各個(gè)組件將調(diào)用各種方法設(shè)置自身屬性實(shí)行可視化界面以及加入到面板之中。再通過(guò)事件監(jiān)聽器實(shí)現(xiàn)事件的監(jiān)聽預(yù)處理機(jī)制。 2.數(shù)據(jù)庫(kù) 在這次課程設(shè)計(jì)中哦我主要負(fù)責(zé)Swing圖像界面,對(duì)于數(shù)據(jù)庫(kù)只做了最簡(jiǎn)單的了解。程序中采用了最流行的關(guān)系型數(shù)據(jù)庫(kù)mysql,雪化了mysql的建立,刪除,與修改以及使用sql語(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行一些簡(jiǎn)單的操作,將按鈕等設(shè)置的監(jiān)聽事件與數(shù)據(jù)庫(kù)相連接。 五、問題與討論 1.組件的方法調(diào)用 在這次課程設(shè)計(jì)中,用到了很多的組件,例如Button,Jlabel,TextField,ComBox,等。Swing圖形界面也確實(shí)提供了很多方法去設(shè)置相關(guān)組件的屬性,例如label.setVisible(false);設(shè)置標(biāo)簽不可見等很多方法,只要查看API文檔幾乎就能實(shí)現(xiàn)很多功能,但是對(duì)于按鈕等最常見的組件來(lái)說(shuō)設(shè)置大小如果不依靠相關(guān)布局方式很難設(shè)置,我在程序中之所以運(yùn)用了很多的bull布局方式就是為了實(shí)現(xiàn)組件大小的設(shè)置,如果說(shuō)能有一個(gè)方法直接設(shè)置組件大小而不受其他組件或容器影響就能使代碼很簡(jiǎn)潔了。2.相對(duì)布局 在編寫圖像界面的程序的時(shí)候,我用了很多的布局方式,有FlowLayout,BorderLayout,GrirLayout,null等,其中null布局用的最多。null布局的優(yōu)點(diǎn)在于可以將組建的位置精準(zhǔn)到坐標(biāo)值,可以把組件放到任意想放置的位置,另外可以通過(guò)null去設(shè)置組件的大小,相較于其他布局方式來(lái)說(shuō)是一個(gè)很大的優(yōu)勢(shì)。但同時(shí)它的缺點(diǎn)在于不能根據(jù)Frame的大小變化而改變位置。其他三種布局方式雖然實(shí)現(xiàn)了歲Frame大小變動(dòng)而改變組件大小及位置但是不容易控制,如果null布局能實(shí)現(xiàn)相對(duì)布局就是很好的一種布局方式了。 《Java課程實(shí)習(xí)》報(bào)告 題目 學(xué)號(hào) 學(xué)生姓名 音樂播放器 201011621335 201011621329 200811621320 朱劍峰 薛文博 劉彬 聯(lián)系方式 *** *** *** 所在專業(yè) 所在班級(jí) 指導(dǎo)教師 成績(jī) 教師簽字 計(jì)算機(jī)科學(xué)與技術(shù) 1103 劉思鳳 課程設(shè)計(jì)時(shí)間:2013年6月1日 至 2013年6月25日 評(píng)語(yǔ): 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 目 錄 摘要......................................................................................................................................2 1 緒論..............................................................................................................................3 1.1 1.2 1.3 1.4 2 2.1 2.2 3 3.1 3.2 課題背景..............................................................................................................3 課程設(shè)計(jì)目的......................................................................................................3 課程設(shè)計(jì)實(shí)驗(yàn)環(huán)境..............................................................................................3 課程設(shè)計(jì)要求......................................................................................................4 程序界面布局設(shè)計(jì)..............................................................................................4 功能分析..............................................................................................................4 系統(tǒng)功能結(jié)構(gòu)圖..................................................................................................5 模塊功能設(shè)計(jì)......................................................................................................5 課程系統(tǒng)分析..............................................................................................................4 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)..........................................................................................................5 3.2.1 “菜單欄”功能設(shè)計(jì)......................................................................................5 3.2.2 “動(dòng)態(tài)音頻播放進(jìn)度顯示”功能設(shè)計(jì)..........................................................9 3.2.3 “歌曲搜索”功能實(shí)現(xiàn)..................................................................................9 3.2.4 “歌曲播放/停止”功能實(shí)現(xiàn)......................................................................10 3.2.5 “列表展示”功能實(shí)現(xiàn)................................................................................11 4 系統(tǒng)優(yōu)點(diǎn)與缺點(diǎn)........................................................................................................13 4.1 4.2 5 系統(tǒng)優(yōu)點(diǎn)...............................................................................................................13 系統(tǒng)缺點(diǎn)...............................................................................................................13 系統(tǒng)開發(fā)過(guò)程............................................................................................................14 Myeclipse平臺(tái)開發(fā)版本...............................................................................................14 NetBeans開發(fā)平臺(tái)版本................................................................................................15 設(shè)計(jì)總結(jié)....................................................................................................................16 參考文獻(xiàn).............................................................................................................................17 附 錄.................................................................................................................................18 關(guān)鍵代碼..........................................................................................................................18 1、音樂解碼函數(shù)(decodeMusic)........................................................................18 2、播放線程類(class PlayThread).....................................................................20 3、控制滾動(dòng)條類(class RunSlider)...................................................................21 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 摘要 JAVA是目前最流行的軟件開發(fā)語(yǔ)言之一,稱為網(wǎng)絡(luò)上的“世界語(yǔ)”。JAVA適合開發(fā)基于多媒體、與平臺(tái)無(wú)關(guān)、用面向?qū)ο蟮姆椒ㄟM(jìn)行的基于Internet、Intranet、Extranet的Applet和應(yīng)用程序。它具有簡(jiǎn)單高效、面向?qū)ο?、不依賴于機(jī)器結(jié)構(gòu)的特點(diǎn),支持多線程、分布和并發(fā)機(jī)制。用JAVA開發(fā)的應(yīng)用軟件在可移植性、健壯性、安全性等方面大大優(yōu)于已存在的其他編程語(yǔ)言。 JAVA是一門包含多種知識(shí)的學(xué)科,提供了豐富的類庫(kù),能最大限度地利用網(wǎng)絡(luò)。JAVA可廣泛用于面向?qū)ο蟮氖录枋?、處理面向?qū)ο蟮钠髽I(yè)型的應(yīng)用開發(fā),還應(yīng)用于Internet系統(tǒng)管理、Web頁(yè)面設(shè)計(jì)、Internet可視化軟件開發(fā)等方面。在學(xué)習(xí)的過(guò)程中我學(xué)到了許多以前沒有學(xué)到的概念和新鮮資訊。運(yùn)用這些知識(shí)可以完成老師交給我的課程設(shè)計(jì)任務(wù)。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個(gè)音樂播放器的課程設(shè)計(jì)題目。 本小組之所以選擇做音樂播放器,全賴于本小組成員均對(duì)音樂有濃厚的興趣,雖熱衷于聽音樂,但現(xiàn)在網(wǎng)上流傳的音樂播放器還不能滿足我們這些發(fā)燒友,像高清音樂等,這些高品質(zhì)的作品若在現(xiàn)流行的播放器上運(yùn)行,這只能做普通音樂文件“享用”。話說(shuō)如此,因本小組開發(fā)能力有限,課程比較多,時(shí)間所限,以至?xí)呵野岩魳凡シ牌鏖_發(fā)到version0.9。主要功能還未能達(dá)到我們想要的境界。 小結(jié)一下,本小組的播放器所具備的功能有如下,添加音樂,刪除音樂,搜索音樂,更換播放器皮膚,更改播放模式等。(詳見2.2節(jié)) 本次設(shè)計(jì)的播放器在具備基本功能的基礎(chǔ)上,還具有很強(qiáng)的擴(kuò)展性,如歌詞導(dǎo)入,可播放音樂類型的增加等等這些還未實(shí)現(xiàn)的地方我們都提供了許多接口,以便日后做修改或增加功能所用。 能夠具備一個(gè)屬于自己的播放器確實(shí)是一件非常高興的事情,能夠一邊開發(fā)一邊享受音樂的熏陶更是一件難得可貴的經(jīng)歷,愿此摘要能讓讀者感受得到筆者的興奮與成功。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 音樂播放器 任務(wù)分工 系統(tǒng)設(shè)計(jì)與代碼實(shí)現(xiàn):朱劍峰 系統(tǒng)測(cè)試與維護(hù):薛文博 需求與功能分析:劉彬 指導(dǎo)教師:劉思鳳 緒論 1.1 課題背景 隨著社會(huì)電子音樂文件的與日俱增,作為現(xiàn)在最流行的音樂文件*.mp3,*.wav文件的數(shù)量和規(guī)模也在比以往的任何時(shí)候要多,不論是電臺(tái)DJ需要使用方便而有效地管理自己所使用的音樂文件,還是個(gè)人。在計(jì)算機(jī)日益普及的今天,若采用一套有效的音樂播放器。將自己所收藏的大量的音樂文件能隨時(shí)隨地的播放,這將方便于眾用戶聽音樂的需求。通過(guò)使用本音樂播放器能為音樂愛好者帶來(lái)意想不到的收獲。 1.2 課程設(shè)計(jì)目的 《應(yīng)用軟件開發(fā)實(shí)習(xí)》是計(jì)算機(jī)相關(guān)專業(yè)的必修專業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專題實(shí)際是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生學(xué)習(xí)完《應(yīng)用軟件開發(fā)實(shí)習(xí)》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,程序設(shè)計(jì)的設(shè)計(jì)目的是加深對(duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計(jì)及其在網(wǎng)絡(luò)開發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識(shí),利用軟件工程為基礎(chǔ)進(jìn)行軟件開發(fā)、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。 1.3 課程設(shè)計(jì)實(shí)驗(yàn)環(huán)境 程序運(yùn)行在安裝有windows操作系統(tǒng)的計(jì)算機(jī)上(臺(tái)式機(jī)和筆記本),兼容windows 2K/XP/Vista/7/8 計(jì)算機(jī)硬件基本要求(僅供參考): 1.2.3.CPU:1G; 內(nèi)存:512M.; 顯卡:256M顯存; 文件播放:需要安裝有聲卡、要求安裝有語(yǔ)音庫(kù)。 JAVA程序設(shè)計(jì)語(yǔ)言及相應(yīng)的集成開發(fā)環(huán)境,Myeclipse和Netbeans開發(fā)工具。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 1.4 課程設(shè)計(jì)要求 按課程設(shè)計(jì)指導(dǎo)書提供的課題,要求學(xué)生在自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且達(dá)到舉一反三的目的,完成一個(gè)項(xiàng)目解決一類問題。要求學(xué)生能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、設(shè)計(jì)和解答類似問題;對(duì)此能夠較好地理解和掌握,能夠進(jìn)行簡(jiǎn)單分析和判斷;能編寫出具有良好風(fēng)格的程序;掌握J(rèn)AVA程序設(shè)計(jì)的基本技能和面向?qū)ο蟮母拍詈头椒ǎ涣私舛嗑€程、安全和網(wǎng)絡(luò)等編程技術(shù)。同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問題、解決問題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。課程系統(tǒng)分析 2.1 程序界面布局設(shè)計(jì) (1)創(chuàng)建一個(gè)JFrame類,類名為MyPlayer類。 (2)向?qū)υ捒蛑刑砑覬Slider控件、JList控件、JLabel控件、JJToggleButton控件、MenuBar菜單、JPanel容器、JToolBar容器以及JScrolPanel容器。 (3)設(shè)置所添加的控件的屬性,以及使用Java的界面風(fēng)格,本設(shè)計(jì)共使用了6種Java 的不同界面風(fēng)格。 2.2 功能分析 MyPlayer播放器主要對(duì)常用Windows音頻格式的文件實(shí)現(xiàn)播放控制: ? 主界面功能 ? 菜單欄功能 ? 添加音樂; ? 添加音樂文件(即導(dǎo)入一個(gè)或多個(gè)音樂文件至列表當(dāng)中); ? 添加音樂目錄(即導(dǎo)入文件夾中所有的音樂文件至列表當(dāng)中); ? 控制; ? 隨機(jī)播放; ? 順序播放; ? 單曲循環(huán); ? 設(shè)置歌詞(有待開發(fā)); ? 更換皮膚; ? 默認(rèn)、深海世界、迷人金屬、香韻咖啡、駭客帝國(guó)、浪漫滿屋(均為java的界面風(fēng)格) ? 關(guān)于; 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 ? 幫助(記錄作者的相關(guān)信息以及軟件開發(fā)的日期); ? 動(dòng)態(tài)音頻播放進(jìn)度顯示; ? 正在播放歌曲在頂層的顯示 ? 播放歌曲的時(shí)間長(zhǎng)度的顯示以及正在播放時(shí)間的長(zhǎng)度的顯示 ? 滾動(dòng)條隨播放狀態(tài)改變顯示 ? 歌曲搜索功能; ? 根據(jù)關(guān)鍵字搜索對(duì)應(yīng)的歌曲; ? 歌曲播放/停止功能; ? 上一首;(播放上一首歌曲并根據(jù)播放模式來(lái)選擇)? 下一首;(播放下一首歌曲并根據(jù)播放模式來(lái)選擇)? 播放/停止;(播放或停止歌曲) ? 雙擊播放/雙擊停止;(在列表中對(duì)指定歌曲的操作)? 列表展示功能; ? 隱藏/顯示列表; ? 移除單個(gè)音樂文件; ? 移除所有音樂文件; ? 顯示當(dāng)前歌曲數(shù)目,播放模式,皮膚情況; 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 3.1 系統(tǒng)功能結(jié)構(gòu)圖 MyPlayer播放器的功能結(jié)構(gòu)圖如圖3-1。 主界面功能菜單欄功能動(dòng)態(tài)音頻播放進(jìn)度顯示歌曲搜索功能歌曲播放/停止功能列表展示功能 圖3-1 主界面功能圖 3.2 模塊功能設(shè)計(jì) 3.2.1 “菜單欄”功能設(shè)計(jì) “菜單欄”功能結(jié)構(gòu)圖如圖3-2-1。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 菜單欄功能添加音樂添加音樂文件添加音樂目錄控制更換皮膚關(guān)于隨機(jī)播放順序播放單曲循環(huán)種皮膚圖3-2-1菜單欄功能結(jié)構(gòu) 6幫助 3.2.1.1 “添加音樂”功能實(shí)現(xiàn) 當(dāng)點(diǎn)擊“添加歌曲/文件夾”選擇“添加本地歌曲”或“添加本地歌曲文件夾”的時(shí)候,這時(shí)候會(huì)觸發(fā)這兩個(gè)JMenuItem事件,調(diào)用了open()函數(shù)(opendir()函數(shù)),即將選中的音樂文件(或文件夾內(nèi)所有音樂文件)的信息(名稱與路徑)放入nameVector 和 urlVector 當(dāng)中。并修改listCount的值,顯示歌曲的總數(shù),最后將nameVector的所有內(nèi)容放入list列表當(dāng)中。如圖3-2-1-1。 圖3-2-1-1(左上)選擇操作,(左下)選擇目錄,(右下)列表顯示 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 3.2.1.2 “控制”功能實(shí)現(xiàn) 當(dāng)選擇“控制”功能的任意一項(xiàng),則會(huì)使全局的chosenMethod整型變量的值根據(jù)選擇的項(xiàng)賦對(duì)應(yīng)的值,值域?yàn)?(隨機(jī)播放)、2(順序播放)、3(單曲循環(huán))。因播放器的播放功能是一個(gè)while(true)的循環(huán),每當(dāng)播放歌曲時(shí)候,播放前會(huì)由函數(shù)chooseNextSong()根據(jù)chosenMethod的值來(lái)選擇下一首歌是那一首。 如果值是1,則會(huì)由[0,listCount(列表歌曲總數(shù))],獲取隨機(jī)數(shù),再根據(jù)play()函數(shù)播放;如果值是2,則根據(jù)chosenIndex(當(dāng)前播放歌曲號(hào)),直接加一,再根據(jù)play()函數(shù)播放;如果值是3,則chosenIndex(當(dāng)前播放歌曲號(hào))的值不再修改,再根據(jù)play()函數(shù)播放;如圖3-2-1-2。 圖3-2-1-2(左上)選擇操作;(左下)隨機(jī)播放后歌曲序號(hào),(此處為后臺(tái)顯示),起始播放第1首歌,下一首歌為第295首歌曲;(右側(cè))為列表顯示,指向?qū)?yīng)歌曲,并且列表底下顯示“隨機(jī)播放” 3.2.1.3 “更換皮膚”功能實(shí)現(xiàn) 當(dāng)選擇“更換皮膚”功能的任意一項(xiàng),則會(huì)觸發(fā)對(duì)應(yīng)事件的發(fā)生,調(diào)用函數(shù)loadskin1()或loadskin2()等等。此時(shí)會(huì)調(diào)用LookAndFeel的類,指定java包含的皮膚風(fēng)格。Loadskin1()對(duì)應(yīng)“默認(rèn)”,loadskin2()對(duì)應(yīng)“深海世界”等等。 選擇皮膚后,主界面底下會(huì)顯示對(duì)應(yīng)的提示,如選擇了“浪漫滿屋”,地下就會(huì)顯示 “皮膚:浪漫滿屋”。如圖3-2-1-3所示。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 圖3-2-1-3 (左)選項(xiàng)顯示,(右)換膚后主 界面情況。 3.2.1.4 “關(guān)于”功能實(shí)現(xiàn) 當(dāng)選擇“幫助”功能時(shí),則彈出信息窗口,提示本軟件的開發(fā)時(shí)間與開發(fā)人員相關(guān)信息。如圖3-2-1-4所示。 圖3-2-1-4 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 3.2.2 “動(dòng)態(tài)音頻播放進(jìn)度顯示”功能設(shè)計(jì) 當(dāng)歌曲播放正在播放時(shí),則頂層“正在播放”處會(huì)顯示歌曲的名稱,當(dāng)歌曲名稱過(guò)長(zhǎng)時(shí)候,超長(zhǎng)部分會(huì)用省略號(hào)顯示。 同時(shí)會(huì)根據(jù)歌曲的格式,得到歌曲的長(zhǎng)度,并顯示在歌曲的右側(cè)的JLabel fileTime中;另外會(huì)另起一個(gè)線程RunSlider來(lái)控制計(jì)時(shí)功能,每1秒鐘,滾動(dòng)條左側(cè)JLabel runningTime 會(huì)根據(jù)播放的時(shí)間來(lái)修改,滾動(dòng)條PlayerSlider則會(huì)每秒鐘根據(jù)runingTime的值來(lái)移動(dòng)。如圖3-2-2所示 圖3-2-2 正在播放歌曲中的動(dòng)態(tài)播放進(jìn)度顯示。 3.2.3 “歌曲搜索”功能實(shí)現(xiàn) 在搜索欄中輸入關(guān)鍵字,在回車確認(rèn),系統(tǒng)就會(huì)調(diào)用seachMusic()來(lái)搜索與關(guān)鍵字吻合的歌曲,并將其放入臨時(shí)的Vector tmpName當(dāng)中,并顯示其到list列表當(dāng)中。如圖3-2-3-1 在臨時(shí)的列表中選擇所需要播放的歌曲,雙擊播放,同時(shí)臨時(shí)列表消失,回復(fù)原來(lái)的列表,即導(dǎo)入nameVector的數(shù)據(jù)到list當(dāng)中。 當(dāng)點(diǎn)擊“X”按鈕,若還在臨時(shí)列表當(dāng)中,則會(huì)清除臨時(shí)列表并且恢復(fù)原來(lái)的列表;若已經(jīng)恢復(fù)到臨時(shí)列表,則搜索框中會(huì)返回提示“請(qǐng)輸入搜索關(guān)鍵字...”。 圖3-2-3-1(上)搜索“陳奕迅”的歌曲 (下)取消搜索后,搜索框的內(nèi)容 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 3.2.4 “歌曲播放/停止”功能實(shí)現(xiàn) “歌曲播放/停止”功能結(jié)構(gòu)圖如圖3-2-4。 歌曲播放/停止功能上一首下一首播放/停止雙擊播放/停止 圖3-2-4 “歌曲播放/停止”功能結(jié)構(gòu) 3.2.4.1 “上一首”“下一首”功能實(shí)現(xiàn) 當(dāng)點(diǎn)擊“上一首”的按鈕時(shí),會(huì)根據(jù)按鈕事件,若chosenMethod(播放方式)的值為1(即隨機(jī)播放)則系統(tǒng)會(huì)調(diào)用chooseNextSong()來(lái)隨機(jī)選擇歌曲號(hào)來(lái)播放下一首歌;若chosenMethod不為1,則會(huì)調(diào)用previousMusic(),對(duì)chosenIndex(當(dāng)前播放歌曲號(hào))減一,再調(diào)用play()函數(shù)播放上一首歌曲。 當(dāng)點(diǎn)擊“下一首”的按鈕時(shí),會(huì)根據(jù)按鈕事件,若chosenMethod(播放方式)的值為1(即隨機(jī)播放)則系統(tǒng)會(huì)調(diào)用chooseNextSong()來(lái)隨機(jī)選擇歌曲號(hào)來(lái)播放下一首歌;若chosenMethod不為1,則會(huì)調(diào)用nextMusic(),對(duì)chosenIndex(當(dāng)前播放歌曲號(hào))加1,再調(diào)用play()函數(shù)播放下一首歌曲。 3.2.4.2 “播放/停止”“雙擊播放/停止”功能實(shí)現(xiàn) 當(dāng)點(diǎn)擊“播放/停止”的按鈕時(shí)候,若點(diǎn)擊了“播放”,則會(huì)顯示“停止”,同時(shí)會(huì)對(duì)列表正在選中的歌曲進(jìn)行播放。同時(shí)會(huì)觸發(fā)“動(dòng)態(tài)音頻播放進(jìn)度顯示”功能(3.2.2節(jié)所介紹),更改或增加播放信息; 若點(diǎn)擊了“停止”,則會(huì)顯示“播放”,同時(shí)會(huì)對(duì)當(dāng)前播放的歌曲進(jìn)行停止,同樣會(huì)觸發(fā)“動(dòng)態(tài)音頻播放進(jìn)度顯示”功能,清除對(duì)應(yīng)的顯示。如圖3-2-4-2 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 圖3-2-4-2(左)“播放” (右)“停止” 3.2.5 “列表展示”功能實(shí)現(xiàn) “列表展示”功能結(jié)構(gòu)圖如圖3-2-5。 列表展示功能隱藏/顯示列表移除音樂文件顯示列表信息 圖3-2-5 “列表展示”功能結(jié)構(gòu) 3.2.5.1 “隱藏/顯示列表”功能實(shí)現(xiàn) 當(dāng)點(diǎn)擊“顯示列表/隱藏列表”的按鈕時(shí)候,若點(diǎn)擊了“顯示列表”,則會(huì)顯示“隱藏列表”,同時(shí)觸發(fā)該事件,將原來(lái)的JFrame大框架的長(zhǎng)度減少440個(gè)單位; 若點(diǎn)擊了“隱藏列表”,則會(huì)顯示“顯示列表”,同時(shí)觸發(fā)該事件,將原來(lái)的JFrame大框架的長(zhǎng)度增加440個(gè)單位。 隱藏與顯示列表這一功能雖然非常簡(jiǎn)單,但其重要性不可忽視,對(duì)于現(xiàn)在許多用戶對(duì)音樂播放器的要求,就如自己的手機(jī)或著MP3一樣,小巧、靈活、精致,至此這一項(xiàng)功能對(duì)于本小組一開始的設(shè)計(jì)就算是一個(gè)亮點(diǎn)。如圖3-2-5-1所示。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 圖3-2-5-1(左)隱藏列表,(右)顯示列表 3.2.5.2 “移除歌曲”功能文件實(shí)現(xiàn) 當(dāng)用鼠標(biāo)對(duì)著列表的音樂文件右鍵的時(shí)候,會(huì)彈出兩個(gè)選項(xiàng)“移除歌曲/移除所有歌曲”。 當(dāng)選擇“移除歌曲”,則對(duì)所選擇的音樂文件從列表中移除,即事件的觸發(fā)調(diào)用了deleteSingle()函數(shù),將對(duì)應(yīng)的項(xiàng)從列表中移除,從nameVector中移除,從urlVector中移除; 同理當(dāng)選擇“移除所有歌曲”的時(shí)候,事件觸發(fā)調(diào)用deleteAll()函數(shù),將列表清空,將nameVector中的元素清除。 以上兩者運(yùn)行過(guò)后均會(huì)更新主界面底層“歌曲數(shù)目”,并且停止正在播放的歌曲。 圖3-2-5-2右鍵列表后出現(xiàn)的選擇項(xiàng) 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 3.2.5.3 “顯示列表信息”功能實(shí)現(xiàn) 由“添加音樂”功能(3.2.1.1節(jié))調(diào)用的open()、opendir()函數(shù),會(huì)將保存在nameVector中的內(nèi)容導(dǎo)入列表當(dāng)中。當(dāng)雙擊列表中的歌曲的時(shí)候,如果歌曲正在播放則會(huì)停止,如果播放器沒有進(jìn)行播放,則雙擊后就進(jìn)行播放。 當(dāng)我們對(duì)著列表右鍵時(shí),則會(huì)彈出列表,“移除歌曲/移除所有歌曲”,詳見(3.2.5.2節(jié))系統(tǒng)優(yōu)點(diǎn)與缺點(diǎn) 4.1 系統(tǒng)優(yōu)點(diǎn) 1、windows界面風(fēng)格可選擇性,如上如所述,本音樂播放器具有6種皮膚可以更換。這大大滿足了一個(gè)娛樂性的軟件的需要,并且皮膚起名也符合用戶的感官需求,像“深海世界”、“浪漫滿屋”這些貼切而休閑的詞匯更能吸引用戶對(duì)播放器的使用。 2、播放方式可選擇性,對(duì)于喜歡聽音樂的用戶,會(huì)根據(jù)自己的需要選擇一定的順序來(lái)聽音樂。 3、列表隱藏的功能,符合大眾播放器的功能,將播放器的界面弄得小巧而精致,即使隱藏了列表也不妨礙主要的播放器功能。 4、搜索功能,隨著網(wǎng)絡(luò)的發(fā)達(dá),音樂歌曲隨處下載,人均播放列表的歌曲數(shù)目數(shù)以百計(jì),這時(shí)候搜索功能就顯得十分重要。本播放器根據(jù)關(guān)鍵字可以對(duì)列表進(jìn)行搜索,并可以顯示搜索后的列表,同時(shí)臨時(shí)的列表不會(huì)縮減播放器功能。 4.2 系統(tǒng)缺點(diǎn) 1、本系統(tǒng)主要代碼均在一個(gè)文件當(dāng)中MyPlayer.java當(dāng)中,由于本小組是用netBeans7.2.1開發(fā)平臺(tái)開發(fā)的,對(duì)開發(fā)平臺(tái)尚未了解,故暫且沒有將代碼弄得更具有可讀性。 2、本播放器還缺少暫停功能,在開發(fā)的最后版本(Music_Player0.9fornetBeans)還在改進(jìn)當(dāng)中。期待1.0版本對(duì)此功能的實(shí)現(xiàn)。 3、本播放器對(duì)音樂文件的選擇,僅僅.mp3文件以及.wav文件可播放。針對(duì)decodeMusic()解碼函數(shù)的改善,尚未能解決。 4、本播放器缺少歌詞設(shè)置、顯示功能。由于本小組對(duì)播放器的主界面還未想到一個(gè)滿意的設(shè)計(jì),所以歌詞的實(shí)現(xiàn)暫且沒有實(shí)現(xiàn),待界面設(shè)計(jì)得靈活的時(shí)候,再添加歌詞的功能。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 系統(tǒng)開發(fā)過(guò)程 Myeclipse平臺(tái)開發(fā)版本 Version 0.1 1、菜單欄 *文件包括“打開文件”“打開目錄”“退出程序” *控制-隨機(jī)播放-順序播放-單曲循環(huán)-設(shè)置歌詞 *更換皮膚 *幫助-關(guān)于 2、上一首、下一首、停止/播放、隱藏列表4個(gè)button 3、幫助顯示-關(guān)于 消息框。 Version0.2 1、能打開文件,顯示文件名稱在下面的框內(nèi),多個(gè)文件顯示在框內(nèi)! 2、文件-退出程序 實(shí)現(xiàn) 3、能夠顯示列表與隱藏列表 Version0.3 1、雙擊能夠播放 2、暫停 跟 繼續(xù) 新增 1、雙擊整個(gè)title 換成為歌曲名稱 問題 1、隱藏列表/顯示列表 list 會(huì)縮水 2、filedialog 沒有選擇任何文件 直接關(guān)閉會(huì)出現(xiàn)錯(cuò)誤?。╲erson0.4中已解決) 3、雙擊空的列表也可以開始(version 0.6for netBeans 已經(jīng)解決) Version0.31(Version0.3崩潰) Version0.4 1、上一首,下一首 能夠在列表中顯示 2、上一首 下一首播放功能 新增: 1、打開文件可以多選 2、打開目錄 可以把整個(gè)目錄里面的MP3、wav文件導(dǎo)出在列表中。 問題: 1、雙擊 第一次 是開始,第二次 是停止(相對(duì)于同一首歌,相對(duì)于其它歌會(huì)停止,也不播放)(version 0.6for netBeans 已經(jīng)解決) 2、播放完一首歌后,不能自動(dòng)往下播放。(version 0.5forneatBeans 已經(jīng)解決) 歌曲不能刪除(version 0.6for netBeans 已經(jīng)解決)修改: 1、“打開文件”“打開目錄”分別換成 添加本地歌曲,添加本地歌曲文件夾 Version0.5 1、皮膚(簡(jiǎn)單的顏色或者圖片) 2、更換皮膚-可供選擇 修改: 1、項(xiàng)目已經(jīng)轉(zhuǎn)至netbeans平臺(tái)上開發(fā),并明明為Music_Player0.5forneatBeans 新增: 1、快捷鍵 添加歌曲/文件夾 添加了快捷鍵 和 關(guān)于 加了快捷鍵 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 Version 0.6 1、播放模式 2、刪除功能 問題: 1、播放列表可以拉出來(lái),播放到名字比較長(zhǎng)的歌曲,list會(huì)變寬!(已經(jīng)完全解決,刪 除正在播放的label) 2、播放按鈕,雙擊 未解決(version0.6已經(jīng)修復(fù)),上一首 下一首 置頂時(shí)候,以及 隨機(jī)播放時(shí)候 下一首上一首序號(hào)問題!(version0.6已經(jīng)修復(fù))。 3、菜單項(xiàng) 選中后,沒有特別標(biāo)志(解決辦法 1、換另外一種菜單項(xiàng) 2、選中菜單項(xiàng)后 字 體等改變) selected 方法!是改變修改字體的?。╲ersion0.7添加1中 解決) 4、刪除 單首歌,序號(hào)不能改變(version0.7已經(jīng)修復(fù))NetBeans開發(fā)平臺(tái)版本 Version0.7 for netbeans 1、添加底下: 歌曲數(shù)目、播放模式、皮膚的顯示 2、歌曲名前面有序號(hào) 3、音樂時(shí)間,以及滾動(dòng)條 4、”正在播放“顯示的問題 Version0.8 for netbeans 1、添加搜索模塊 2、添加搜索功能 3、搜索功能->搜索列表播放功能 Version0.9fornetbeans 1、修改播放器軟件運(yùn)行時(shí)的圖標(biāo)(將java的圖標(biāo)換成“射手”圖標(biāo)) 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 設(shè)計(jì)總結(jié) JAVA是目前最流行的軟件開發(fā)語(yǔ)言之一,稱為網(wǎng)絡(luò)上的“世界語(yǔ)”。JAVA適合開發(fā)基于多媒體、與平臺(tái)無(wú)關(guān)、用面向?qū)ο蟮姆椒ㄟM(jìn)行的基于Internet、Intranet、Extranet的Applet和應(yīng)用程序。它具有簡(jiǎn)單高效、面向?qū)ο蟆⒉灰蕾囉跈C(jī)器結(jié)構(gòu)的特點(diǎn),支持多線程、分布和并發(fā)機(jī)制。用JAVA開發(fā)的應(yīng)用軟件在可移植性、健壯性、安全性等方面大大優(yōu)于已存在的其他編程語(yǔ)言。 JAVA是一門包含多種知識(shí)的學(xué)科,提供了豐富的類庫(kù),能最大限度地利用網(wǎng)絡(luò)。JAVA可廣泛用于面向?qū)ο蟮氖录枋?、處理面向?qū)ο蟮钠髽I(yè)型的應(yīng)用開發(fā),還應(yīng)用于Internet系統(tǒng)管理、Web頁(yè)面設(shè)計(jì)、Internet可視化軟件開發(fā)等方面。在學(xué)習(xí)的過(guò)程中我學(xué)到了許多以前沒有學(xué)到的概念和新鮮資訊。運(yùn)用這些知識(shí)可以完成老師交給我的課程設(shè)計(jì)任務(wù)。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個(gè)音樂播放器的課程設(shè)計(jì)題目。 課程設(shè)計(jì)的過(guò)程雖然是艱難而辛苦的,但是我卻從中感到了快樂與欣慰??鞓肥且?yàn)槲乙郧皩?duì)于JAVA的知識(shí)可以說(shuō)是孤陋寡聞,但是通過(guò)這次課程設(shè)計(jì)我使自己的知識(shí)更加的豐富了,加大了自己的知識(shí)面。讓自己的實(shí)力擴(kuò)大了。所以我感到非常的快樂。欣慰是因?yàn)榭粗约鹤龀龅恼n程設(shè)計(jì)得到了老師的認(rèn)同,取得了成功。這次課程設(shè)計(jì)的整體過(guò)程是充實(shí)而滿足的。 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 參考文獻(xiàn) [1](美)??藸枺‥ckel , B.)著,《Java編程思想》(第四版)陳昊鵬譯.一北京: 機(jī)械工業(yè)出版社,2007.6 [2] 刁成嘉 著,《UML系統(tǒng)建模與分析設(shè)計(jì)》,機(jī)械工業(yè)出版社,2007.6 [3] 朱喜福 著,《Java程序設(shè)計(jì)》(第2版),清華大學(xué)出版社, 2009.10 [4] 辛運(yùn)幃 著,《Java語(yǔ)言程序設(shè)計(jì)》(第1版),人民郵電出版社, 2009.10 [5] 葉核亞 著,《Java程序設(shè)計(jì)實(shí)用教程》(第3版),電子工業(yè)出版社,2010.2 [6] 耿祥義,張躍平編著,《Java面向?qū)ο蟪绦蛟O(shè)計(jì)》.一北京:清華大學(xué)出版社,2010.1 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 附 錄 關(guān)鍵代碼 1、音樂解碼函數(shù)(decodeMusic) 解析:由于java applet播放聲音,對(duì)應(yīng)的格式只有一些原始格式如.au、.Wav、.Midi、.rfm格式,因此一下的解碼函數(shù)就非常必要了,即將MP3等其它格式文件的音頻等格式修改成系統(tǒng)能夠?qū)崿F(xiàn)的格式,并寫入內(nèi)存由此來(lái)實(shí)現(xiàn)播放功能。詳細(xì)實(shí)現(xiàn)請(qǐng)閱讀如下代碼。 public void decodeMusic(AudioInputStream in){// 開始解碼 MP3 AudioFormat format = in.getFormat(); AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,// 音頻編碼技術(shù) format.getSampleRate(),// 每秒的樣本數(shù) 16,// 每個(gè)樣本中的位數(shù) format.getChannels(),// 聲道數(shù)(單聲道 1 個(gè),立體聲 2 個(gè),等等) format.getChannels()* 2,// 每幀中的字節(jié)數(shù) format.getSampleRate(), false);// 每秒的幀數(shù)和是否以 big-endian // 字節(jié)順序存儲(chǔ)單個(gè)樣本中的數(shù)據(jù) // 然后重新獲取一個(gè)新的輸入流,AudioInputStream decodeIn = AudioSystem.getAudioInputStream(decodedFormat, in);/** * 源數(shù)據(jù)行是可以寫入數(shù)據(jù)的數(shù)據(jù)行。它充當(dāng)其混頻器的源。應(yīng)用程序?qū)⒁纛l字節(jié)寫入源數(shù)據(jù)行,這樣可處理字節(jié)緩沖并將它們傳遞給混頻器。 * 混頻器可以將這些樣本與取自其他源的樣本混合起來(lái),然后將該混合物傳遞到輸出端口之類的目標(biāo)(它可表示聲卡上的音頻輸出設(shè)備)。 * */ SourceDataLine sdl = null;// 然后 DataLine.Info info = new DataLine.Info(SourceDataLine.class,decodedFormat);try { /** * AudioSystem :類充當(dāng)取樣音頻系統(tǒng)資源的入口點(diǎn)。此類允許查詢和訪問安裝在系統(tǒng)上的混頻器 * **/ sdl =(SourceDataLine)AudioSystem.getLine(info); sdl.open(decodedFormat); } catch(Exception e){ 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 e.printStackTrace();} /** 指示該行是否支持特定類型的控件。*/ if(sdl.isControlSupported(FloatControl.Type.PAN)){ // FloatControl 對(duì)象提供對(duì)浮點(diǎn)值范圍的控制 FloatControl pan =(FloatControl)sdl .getControl(FloatControl.Type.PAN); if(curPosition == Position.RIGHT){ pan.setValue(1.0f); } else if(curPosition == Position.LEFT){ pan.setValue(-1.0f); } } sdl.start();int nBytesRead = 0;byte[] abData = new byte[EXTERANAL_BUFFER_SIZE];try { while(nBytesRead!=-1){ // 文件流的讀寫 nBytesRead = decodeIn.read(abData, 0, abData.length); if(nBytesRead >= 0){ sdl.write(abData, 0, nBytesRead); } } } catch(Exception e){ e.printStackTrace(); return;} finally { // 通過(guò)在清空數(shù)據(jù)行的內(nèi)部緩沖區(qū)之前繼續(xù)數(shù)據(jù) I/O,排空數(shù)據(jù)行中的列隊(duì)數(shù)據(jù)。 sdl.drain(); sdl.close();} } 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 2、播放線程類(class PlayThread) 解析:本播放器只使用一個(gè)線程來(lái)實(shí)現(xiàn)歌曲播放的功能,若用戶要更換歌曲或者停止音樂,則對(duì)線程重建,即殺死原線程再建立新的線程,其實(shí)現(xiàn)的效果還是跟原來(lái)線程一樣。同時(shí)此線程包含了許多子功能,如更改播放模式,對(duì)“上一首”“下一首”顯示“正在播放”等功能均在此線程上實(shí)現(xiàn)。詳細(xì)內(nèi)容請(qǐng)閱讀如下代碼。 class PlayThread extends Thread{ public void run(){ while(true){ try { setInitShowing();//初始化滾動(dòng)條以及計(jì)時(shí)label 的值 isStop = true;//標(biāo)志狀態(tài),說(shuō)明是停止了 filename =(String)nameVector.get(chosenIndex).toString();//取chosenIndex對(duì)應(yīng)的歌曲名稱 filepath =(String)urlVector.get(chosenIndex).toString();////取chosenIndex對(duì)應(yīng)的歌曲路徑 System.out.println(“我在播放:”+chosenIndex+“ ”+filename);//后臺(tái)輸出檢測(cè) /*設(shè)置“正在播放”的值,只輸出前23個(gè)字符,以免超出長(zhǎng)度,后面補(bǔ)...*/ String showName = null; if(filename.length()>23){ showName = filename.substring(0, 23)+ “..”; }else{ showName = filename; } showTileOfMusic.setText(“正在播放:”+showName); File file = new File(filepath); setTitle(filename); list.setSelectedValue(nameVector.get(chosenIndex), true); listIndex = chosenIndex; stporplySongButton.setText(“停止”);//修改 停止/播放button的狀態(tài)值 AudioInputStream in = AudioSystem.getAudioInputStream(file);//去音樂文件 AudioFileFormat aff = AudioSystem.getAudioFileFormat(file);//去音樂文件的格式(為了得到歌曲長(zhǎng)度) musicLength = aff.getFrameLength()/aff.getFormat().getFrameRate();//取音樂文件的長(zhǎng)度 System.out.println(“我有那么長(zhǎng):”+musicLength);//后臺(tái)顯示,用于檢測(cè) setShowingTime(musicLength,fileTime);//顯示總長(zhǎng)度到fileTime label中 PlayerSlider.setMaximum((int)musicLength);//并且設(shè)置滾動(dòng)條的最大值 isStop = false;//設(shè)置正在播放狀態(tài) hasStop = false;//設(shè)置正在播放狀態(tài) decodeMusic(in);//解碼并播放 isStop = true;//播放完畢后設(shè)置回非播放狀態(tài) hasStop = true; 廣東海洋大學(xué)本科生課程設(shè)計(jì)報(bào)告 chooseNextSong();//選擇下一首歌返回while } catch(Exception e){ //e.printStackTrace(); System.out.println(“剛才那首歌出錯(cuò)了!”);//如果出現(xiàn)錯(cuò)誤,則顯示直接跳至下一首歌 nextMusic(); } } } } 3、控制滾動(dòng)條類(class RunSlider) 解析:此類雖然簡(jiǎn)短,但其能動(dòng)態(tài)實(shí)現(xiàn)滾動(dòng)條以及播放時(shí)間的運(yùn)動(dòng)。其中setShowingTime()方法提供的接口十分靈活,能夠?qū)Σ煌臻g進(jìn)行時(shí)間的控制,本播放器只對(duì)播放時(shí)間的兩個(gè)JLabel實(shí)現(xiàn)了此功能,這大大提高了本播放器的可擴(kuò)展性。詳細(xì)內(nèi)容請(qǐng)閱讀如下代碼。 class RunSlider extends Thread{ public void run(){ try { musicCouter = 0; while(true){ Thread.sleep(1000);//每秒鐘滾動(dòng)一次 musicCouter++; PlayerSlider.setValue((int)musicCouter); setShowingTime(musicCouter, runingTime);//轉(zhuǎn)換時(shí)間并顯示回去runingTime label } } catch(InterruptedException ex){ Logger.getLogger(MyPlayer.class.getName()).log(Level.SEVERE, null, ex); } } }第三篇:ATM取款機(jī)java課程設(shè)計(jì)
第四篇:Java課程設(shè)計(jì)報(bào)告
第五篇:Java課程設(shè)計(jì)報(bào)告