




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章課題概述本次Java課程設(shè)計題目是設(shè)計一個學(xué)生通訊錄,可以進行顯示全部、修改、添加、刪除、查找、排序操作。1.1課題目的通訊錄是很普遍和實用的程序,它幫助人們記錄大量信息,并供人們查找修改等。有了通訊錄,人們可以更加快捷方便地查詢到自己想要的人物信息。這就會節(jié)約人們很多時間,比起紙質(zhì)的來說,這個更加高效。此學(xué)生通訊錄用來記載每位同學(xué)的具體信息,如果當(dāng)用戶需要某位同學(xué)的信息的時候,可以通過查找迅速找到相關(guān)信息,也可以往其中不斷添加新的學(xué)生。通過這些,來替自己管理學(xué)生信息,自然擁有很大的實際價值。1.2課題要求1.2.1輸入輸出要求=1\*GB2⑴程序運行后應(yīng)先輸出一個圖形界面菜單,其中有顯示全部、修改、添加、刪除、查找、排序功能來供用戶選擇,以便用戶需求。=2\*GB2⑵用戶在使用完一個功能后,可以返回到主界面,并且數(shù)據(jù)也在隨時更新。=3\*GB2⑶用戶在對通訊錄進行添加、修改或是刪除時,在實現(xiàn)完相應(yīng)功能后,會保存到文件中,并在下次顯示信息時有相應(yīng)信息。=4\*GB2⑷當(dāng)用戶進行添加、修改或是刪除時,在實現(xiàn)完相應(yīng)功能后,會讓文件中的信息立即更新,在不必重新運行程序的情況下,就可以即時顯示最新信息。1.2.2程序?qū)崿F(xiàn)功能要求=1\*GB2⑴顯示全部功能需要顯示所有已添加學(xué)生的信息,將文件中所保存的學(xué)生信息反序列化,然后將其以字符串的形式顯示在文本域中。=2\*GB2⑵修改功能需要顯示出用戶指定人物的信息,并允許用戶對這些信息進行修改,在用戶修改完畢后,能夠?qū)⑽募邢鄳?yīng)人物的信息更新為修改后的信息,將原有的信息消除。=3\*GB2⑶添加功能需要顯示一個包括姓名、性別、關(guān)系、電話、手機、地址、郵編、E-mail的信息添加項,并可以讓用戶逐一或者選擇添加,在添加完成后將新的信息添加到文件中,并對其進行編號,即使程序重新啟動也依然會顯示相應(yīng)信息。=4\*GB2⑷刪除功能需要尋找到用戶所指定的人物信息,并將其的所有信息在文件中移除。=5\*GB2⑸查找功能需要為用戶提供兩種查找方式,一種為按姓名查找,另一種為按關(guān)系查找,并且當(dāng)用戶根據(jù)提示進行相關(guān)操作后可以只顯示出自己所需要的信息。=6\*GB2⑹排序功能需要實現(xiàn)將已有的人物信息,按照人物姓名拼音字母的順尋進行排序,并且將排序好的名字的信息按順序顯示出來。
第2章概要設(shè)計2.1整個程序的模塊結(jié)構(gòu)及流程根據(jù)課題要求,整個程序按功能可劃分為顯示全部、修改、添加、刪除、查找、排序這六個主要模塊。并在除顯示全部和查找模塊只有文件的讀取外,其它四個模塊都有文件的讀取與寫入模塊,方便文件的及時更新。除了這六個模塊外,為了讓用戶使用起來更加簡單明確,還添加了一些提示性的對話框。并且還為每一個功能的窗口都提供了返回主界面的按鈕,方便用戶在不同功能之間來回使用。圖2-1整個程序各功能模塊間的流程2.2信息的存儲方式用戶在用完一系列功能后,不能讓數(shù)據(jù)僅僅保存在內(nèi)存中,在退出程序再重新打開查看時信息應(yīng)該還在。這就需要將數(shù)據(jù)存在文件中,當(dāng)用戶再次查看時程序?qū)x取文件中的信息,這樣就能保證數(shù)據(jù)的持久性。當(dāng)完成添加、刪除或修改功能后,需要更新數(shù)據(jù),也就是在向文件中寫入新信息。因為涉及到按姓名查找和按關(guān)系查找這兩個功能,所以要采用HashMap這個類對信息進行存儲。因為姓名和關(guān)系是索引,所以將這兩項分別作為鍵,將具體信息分別作為這兩個鍵的值。因為編輯序號以及排序功能的需要,還要將姓名存在ArrayList中。如果直接用HashMap來在文本域中顯示信息的話,會在重名的時候無法按順序顯示,所以還要用字符串對信息進行保存。最后將將這三類對象寫入文件中,如此就完成了對于數(shù)據(jù)的更新和保存。2.3數(shù)據(jù)讀取與數(shù)據(jù)初步處理當(dāng)在使用某個功能時,程序會將文件中的數(shù)據(jù)讀取。由于在寫入文件時是按三種對象寫的,所以在讀取的時候也要一一對應(yīng),這樣就可以將文件中的數(shù)據(jù)準確無誤的讀入內(nèi)存,以備使用。用戶輸入的信息是字符串,并且窗口顯示出的信息也同樣是字符串,所以就要給HashMap和ArrayList用上泛型,也就是HashMap<String><String>和ArrayList<String>,這樣就可以避免在添加信息或是在類型轉(zhuǎn)換的時候發(fā)生錯誤。2.4各功能的設(shè)計思路描述2.4.1顯示全部功能顯示全部功能就是將所有文件中的學(xué)生信息一次性展示出來。因為實在文件中的數(shù)據(jù),所以要先要有對文件進行讀取的動作,之后將所讀取出的信息的字符串顯示在文本域中。如果在文件中沒有任何人物信息,則需要在文本域中顯示相應(yīng)提示,告知用戶這個通訊錄為空。2.4.2修改功能修改功能的實質(zhì)就是將就有的信息替換為新的信息,就是字符串內(nèi)容的替換。首先,要讀取文件數(shù)據(jù),然后找到用戶所想要改的人物信息,并將其顯示在文本域中,然后用戶根據(jù)自己的需求進行修改,如果沒有此人,測顯示查無此人。在修改結(jié)束后,將舊有的信息刪除,將修改好的信息重新寫入文件。2.4.3添加功能添加功能是所有功能的基礎(chǔ),全都靠它來規(guī)范數(shù)據(jù)。首先,添加功能要在窗口中依次顯示姓名、性別、關(guān)系、電話、手機、地址、郵編、E-mail這幾項信息欄供用戶來添加。并且當(dāng)用戶沒有添加人名或關(guān)系時要有所提示。而性別和關(guān)系是指定的幾項,來供用戶進行選擇。而對于E-mail的地址,郵箱類型時也會給用戶進行選擇,也可讓用戶自行填寫。當(dāng)用戶完成添加之后,可以及時保存到文件中,并且會提示用戶是否還要繼續(xù)添加,是則返回刪除界面,否則返回主界面。2.4.4刪除功能刪除功能能在文件中消除用戶指定的人物的信息。在刪除界面,要提供給用戶一個填寫名字的文本域,然后程序根據(jù)所填寫人名在文件中進行搜索,并將其刪除。如果在文件中沒有找到此人名,將會彈出一個新窗口提示用戶沒有此人。當(dāng)刪除結(jié)束后,將會提示用戶是否要繼續(xù)刪除,是則返回刪除界面,否則返回主界面。2.4.5查找功能查找功能是將用戶想要的信息顯示出來。查找功能分為按姓名查找和安關(guān)系查找方式。按姓名查找是用戶輸入一個人名,然后程序在文件中搜索,然后在文本域中顯示相關(guān)信息。如果沒有此人,則要提示用戶查無此人。按關(guān)系查找是給用戶三個選擇項,分別是“同學(xué)”、“室友”、“老鄉(xiāng)”。用戶可以選一個或是多個關(guān)系,當(dāng)用戶選擇完畢確定后,將在文本域中顯示此關(guān)系下的所有人物信息。2.4.6排序功能排序功能是將信息按指定順序依次列出。在本程序中是按姓名的漢語拼音從a到z依次顯示。先將所有姓名按照此順序排好,然后再依次輸出對應(yīng)名字的信息。
第3章程序功能的實現(xiàn)3.1主界面的實現(xiàn)主界面有六個按鈕,分別是顯示全部、修改、添加、刪除、查找、排序。中間是歡迎使用字樣,為每個按鈕添加監(jiān)聽器。當(dāng)運行時,調(diào)用主方法就會出現(xiàn)主界面。主界面的主要代碼如下: Filef=newFile("D:/MailList.dat"); publicMainFrm(){ Mainf=newJFrame("學(xué)生通訊錄");\\主窗口界面,在標題欄寫有"學(xué)生通訊錄"字樣\\對界面布局 JPanelNjp=newJPanel(); JPanelSjp=newJPanel();\\分別在北區(qū)和南區(qū)添加JPanel組件以便于布置按鈕 Fontfo=newFont("黑體",5,50); JLabeljl=newJLabel("歡迎使用",JLabel.CENTER);\\設(shè)置字體,在JLabel組件中心顯示 jl.setFont(fo); Allbtn=newJButton("顯示全部"); changebtn=newJButton("修改"); addbtn=newJButton("添加"); delbtn=newJButton("刪除"); serbtn=newJButton("查找"); sorbtn=newJButton("排序");\\創(chuàng)建六個功能按鈕 Containerc=Mainf.getContentPane(); BorderLayoutbl=newBorderLayout();\\將主界面設(shè)為BorderLayout布局 Mainf.setLayout(bl); Mainf.setBounds(700,300,400,300);\\設(shè)置主界面出現(xiàn)位置和大小 Njp.add(changebtn); Njp.add(Allbtn); Njp.add(addbtn); Sjp.add(delbtn); Sjp.add(serbtn); Sjp.add(sorbtn); c.add(Njp,bl.NORTH); c.add(jl,bl.CENTER); c.add(Sjp,bl.SOUTH);\\添加各組件AllbtnMonitorAllm=newAllbtnMonitor(Mainf,f);Allbtn.addActionListener(Allm); changebtnMonitorchangem=newchangebtnMonitor(Mainf,f); changebtn.addActionListener(changem); addbtnMonitoraddm=newaddbtnMonitor(Mainf,f); addbtn.addActionListener(addm); delbtnMonitordelm=newdelbtnMonitor(Mainf,f); delbtn.addActionListener(delm); serbtnMonitorserm=newserbtnMonitor(Mainf,f); serbtn.addActionListener(serm); sorbtnMonitorsorm=newsorbtnMonitor(Mainf,f); sorbtn.addActionListener(sorm);\\添加點擊監(jiān)聽器 Mainf.setDefaultCloseOperation(Mainf.EXIT_ON_CLOSE); Mainf.setVisible(true); }publicstaticvoidmain(String[]args){ newMainFrm();\\主方法,用于顯示主界面}3.2主要功能模塊的實現(xiàn)3.2.1顯示全部的實現(xiàn)首先要構(gòu)建一個子窗口,然后指定文件和主窗口。在顯示全部界面中,添加一個文本域用于顯示全部信息,最下方有一個返回鍵用于返回主界面。顯示全部的主要代碼如下:publicAllbtnMonitor(JFramejf,Filef){\\用于指定此窗口的母窗口和使用文件 this.jf=jf; this.f=f; } publicvoidactionPerformed(ActionEvente){ try{ FileInputStreamfi=newFileInputStream(f); ObjectInputStreamoi=newObjectInputStream(fi); HashMap<String,String>name=newHashMap<String,String>(); name=(HashMap<String,String>)oi.readObject(); ArrayList<String>al=newArrayList<String>(); al=(ArrayList<String>)oi.readObject(); Strings=(String)oi.readObject(); fi.close(); oi.close();\\讀取文件中的信息 ja.setText(s);\\將所有信息在文本域中顯示 ja.setEditable(false);\\設(shè)置為不可寫 }catch(ClassNotFoundExceptione1){ }catch(IOExceptione1){ ja.setText("此通訊簿為空");\\如果沒有數(shù)據(jù)就要提醒用戶 } js.setVerticalScrollBarPolicy(js.VERTICAL_SCROLLBAR_AS_NEEDED); js.setHorizontalScrollBarPolicy(js.HORIZONTAL_SCROLLBAR_AS_NEEDED);\\設(shè)置文本域有橫縱滾動條,在需要的時候出現(xiàn) JButtonreb=newJButton("返回"); c.add(jp,BorderLayout.CENTER); c.add(reb,BorderLayout.SOUTH);\\將文本域放在中間,返回按鈕放在南區(qū) AllreMonitorrem=newAllreMonitor(); reb.addActionListener(rem);\\返回按鈕加上監(jiān)聽器 jf.setVisible(false);\\此界面下,主界面隱藏 Alljd.setVisible(true); }\\設(shè)置返回按鈕動作,按下后此界面關(guān)閉,主界面出現(xiàn)classAllreMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ jf.setVisible(true); Alljd.dispose(); }}3.2.2修改的實現(xiàn)當(dāng)用戶輸入指定名字時,程序?qū)ξ募?nèi)容進行搜索,讓后在文本域中顯示相應(yīng)信息,用戶自行改寫,當(dāng)該寫好后,點擊按鈕保存,然后會跳出有一個對話框詢問用戶是否繼續(xù)修改。修改的主要代碼如下:構(gòu)造方法與第一個功能一樣publicvoidactionPerformed(ActionEvente){GridLayoutcjgl=newGridLayout(2,1);changejd.setLayout(cjgl);\\設(shè)置此界面的布局為兩行一列的GridLayout布局FlowLayoutYjfl=newFlowLayout();Yjp.setLayout(Yjfl);\\設(shè)置填寫人名一欄的布局為流式布局BorderLayoutMebl=newBorderLayout();Mejp.setLayout(Mebl);\\設(shè)置信息欄及返回鍵的布局為BorderLayoutJLabelNajl=newJLabel("請輸入");Najt=newJTextField();Yjb=newJButton("確定");YMonitorYm=newYMonitor();Yjb.addActionListener(Ym);JLabelcgjl=newJLabel("請修改");Meja=newJTextArea();js.setHorizontalScrollBarPolicy(js.HORIZONTAL_SCROLLBAR_AS_NEEDED);\\設(shè)置文本域中的滾動條Mejp.add(cgjl,Mebl.NORTH);Mejp.add(js,Mebl.CENTER);Ycjb=newJButton("確定更改");YcMonitorYcm=newYcMonitor();Ycjb.addActionListener(Ycm);Cjb3=newJButton("取消");CMonitorCm=newCMonitor();Cjb3.addActionListener(Cm);YCjp=newJPanel();FlowLayoutYCfl=newFlowLayout(FlowLayout.CENTER);\\將最下方兩個按鍵一欄設(shè)為流式布局YCjp.setLayout(YCfl);Mejp.add(YCjp,Mebl.SOUTH);\\將提示新信息放北區(qū),文本域放在中間,取消按鈕放在南區(qū)jf.setVisible(false);\\此界面下,主界面隱藏changejd.setVisible(true);}\\設(shè)置確定姓名按鈕動作,當(dāng)按下此按鈕后,程序會根據(jù)相應(yīng)的姓名鍵,去找它在HashMap中所對應(yīng)的值并供用戶修改classYMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ try{\\讀取文件數(shù)據(jù) FileInputStreamfi=newFileInputStream(f); ObjectInputStreamoi=newObjectInputStream(fi); name=newHashMap<String,String>(); name=(HashMap<String,String>)oi.readObject(); al=newArrayList<String>(); al=(ArrayList<String>)oi.readObject(); s=(String)oi.readObject(); fi.close(); oi.close(); oname=Najt.getText().trim();\\記錄初始名字 if(oname==null){\\如果沒有填寫名字將會提示用戶輸入 Meja.setText("請先輸入姓名"); }elseif(s.indexOf(Najt.getText().trim())==-1){\\如果找不到此姓名,則會告知用戶此人不存在 Najt.setText(""); Meja.setText("查無此人"); Meja.setEditable(false); }else{\\找到此姓名,將此姓名對應(yīng)的信息顯示在文本域中,并初始輸入名欄 Meja.setText(name.get(Najt.getText().trim())); Meja.setEditable(true); Najt.setText(""); } }catch(ClassNotFoundExceptione1){ }catch(IOExceptione1){\\如果通訊錄為空則會給用戶提示 Najt.setText(""); Meja.setText("此通訊簿為空"); } } }\\設(shè)置確定更改按鈕動作,按下后就有的信息將會清除,而會加上修改后的信息classYcMonitorimplementsActionListener{ JDialogcsjd; publicvoidactionPerformed(ActionEvente){ Stringnname=null; Stringmg=Meja.getText();\\循環(huán)結(jié)構(gòu),來防止重名人物信息不能有效更改,將每一個姓名中的每一條信息分開,單獨操作 for(;mg.indexOf("姓名:")!=-1;){\\判斷是否還有另一條信息 intnbp=0;\\截取信息開始的位置 intnep=0; for(;mg.charAt(nep)!='E';){ nep=nep+1; } for(intnepp=nep;mg.charAt(nepp+6)!='\n';nepp++){ nep=nepp+6; }\\獲得截取信息結(jié)束前倒數(shù)第二個位置 Stringnmstr=mg.substring(nbp,nep+2);\\獲得截取信息 inti=nmstr.indexOf(oname); intj=nmstr.indexOf("姓名:");\\判斷姓名是否更改 if(i==-1){ intk=0; for(;nmstr.charAt(k)!='\n';){ k=k+1; } nname=nmstr.substring(j+3,k).trim();\\如果名字更改,獲取新名字 }else{ nname=oname;\\沿用初始名字 } Stringc=name.get("同學(xué)"); Stringcr=name.get("同學(xué)、室友"); Stringcl=name.get("同學(xué)、老鄉(xiāng)"); Stringcrl=name.get("同學(xué)、室友、老鄉(xiāng)"); Stringr=name.get("室友"); Stringrl=name.get("室友、老鄉(xiāng)"); Stringl=name.get("老鄉(xiāng)");\\保存截取信息修改前的信息 intobp; intoep; for(obp=0;name.get(oname).charAt(obp)!='姓';){ obp=obp+1; } for(oep=1;name.get(oname).charAt(oep)!='E';){ oep=oep+1; } for(intoepp=oep;name.get(oname).charAt(oepp+6)!='\n';oepp++){ oep=oepp+6; } Stringomstr=name.get(oname).substring(obp,oep+2); intoc=name.get(oname).indexOf("同學(xué)"); intor=name.get(oname).indexOf("室友"); intol=name.get(oname).indexOf("老鄉(xiāng)");\\判斷修改前信息包含哪幾種關(guān)系 intnt=nmstr.indexOf("同學(xué)"); intnr=nmstr.indexOf("室友"); intnl=nmstr.indexOf("老鄉(xiāng)");\\判斷修改后信息包含哪幾種關(guān)系\\將各關(guān)系中包含有此舊信息的數(shù)據(jù)清除 if(oc!=-1){ if(or!=-1){ if(ol!=-1){ name.put("同學(xué)、室友、老鄉(xiāng)",crl.replaceAll("\n\r"+omstr,"")); crl=crl.replaceAll("\n\r"+omstr,""); name.put("同學(xué)",c.replaceAll("\n\r"+omstr,"")); c=c.replaceAll("\n\r"+omstr,""); name.put("室友",r.replaceAll("\n\r"+omstr,"")); r=r.replaceAll("\n\r"+omstr,""); name.put("老鄉(xiāng)",l.replaceAll("\n\r"+omstr,"")); l=l.replaceAll("\n\r"+omstr,""); name.put("同學(xué)、室友",cr.replaceAll("\n\r"+omstr,"")); cr=cr.replaceAll("\n\r"+omstr,""); name.put("室友、老鄉(xiāng)",rl.replaceAll("\n\r"+omstr,"")); rl=rl.replaceAll("\n\r"+omstr,""); name.put("同學(xué)、老鄉(xiāng)",cl.replaceAll("\n\r"+omstr,"")); cl=cl.replaceAll("\n\r"+omstr,""); } else{ name.put("同學(xué)、室友",cr.replaceAll("\n\r"+omstr,"")); cr=cr.replaceAll("\n\r"+omstr,""); name.put("同學(xué)",c.replaceAll("\n\r"+omstr,"")); c=c.replaceAll("\n\r"+omstr,""); name.put("室友",r.replaceAll("\n\r"+omstr,"")); r=r.replaceAll("\n\r"+omstr,""); } }elseif(ol!=-1){ name.put("同學(xué)",c.replaceAll("\n\r"+omstr,"")); c=c.replaceAll("\n\r"+omstr,""); name.put("老鄉(xiāng)",l.replaceAll("\n\r"+omstr,"")); l=l.replaceAll("\n\r"+omstr,""); name.put("同學(xué)、老鄉(xiāng)",cl.replaceAll("\n\r"+omstr,"")); cl=cl.replaceAll("\n\r"+omstr,""); }else{ name.put("同學(xué)",c.replaceAll("\n\r"+omstr,"")); c=c.replaceAll("\n\r"+omstr,""); } }elseif(or!=-1){ if(ol!=-1){ name.put("室友",r.replaceAll("\n\r"+omstr,"")); r=r.replaceAll("\n\r"+omstr,""); name.put("老鄉(xiāng)",l.replaceAll("\n\r"+omstr,"")); l=l.replaceAll("\n\r"+omstr,""); name.put("室友、老鄉(xiāng)",rl.replaceAll("\n\r"+omstr,"")); rl=rl.replaceAll("\n\r"+omstr,""); }else{ name.put("室友",r.replaceAll("\n\r"+omstr,"")); r=r.replaceAll("\n\r"+omstr,""); } }elseif(ol!=-1){ name.put("老鄉(xiāng)",l.replaceAll("\n\r"+omstr,"")); l=l.replaceAll("\n\r"+omstr,""); }\\將舊信息在各數(shù)據(jù)中徹底清除 Stringnna=name.get(oname).replaceAll(omstr,""); name.put(oname,nna); al.remove(oname); mg=mg.replaceAll(nmstr,"");\\將新信息添加在新信息所包含的各關(guān)系中 if(nt!=-1){ if(nr!=-1){ if(nl!=-1){ name.put("同學(xué)",c+"\n\r"+nmstr); name.put("室友",r+"\n\r"+nmstr); name.put("老鄉(xiāng)",l+"\n\r"+nmstr); name.put("同學(xué)、室友",cr+"\n\r"+nmstr); name.put("同學(xué)、室友、老鄉(xiāng)",crl+"\n\r"+nmstr); name.put("同學(xué)、老鄉(xiāng)",cl+"\n\r"+nmstr); name.put("室友、老鄉(xiāng)",rl+"\n\r"+nmstr); } else{ name.put("同學(xué)",c+"\n\r"+nmstr); name.put("室友",r+"\n\r"+nmstr); name.put("同學(xué)、室友",cr+"\n\r"+nmstr); } }elseif(nl!=-1){ name.put("同學(xué)",c+"\n\r"+nmstr); name.put("老鄉(xiāng)",l+"\n\r"+nmstr); name.put("同學(xué)、老鄉(xiāng)",cl+"\n\r"+nmstr); }else{ name.put("同學(xué)",c+"\n\r"+nmstr); } }elseif(nr!=-1){ if(nl!=-1){ name.put("室友",r+"\n\r"+nmstr); name.put("老鄉(xiāng)",l+"\n\r"+nmstr); name.put("室友、老鄉(xiāng)",rl+"\n\r"+nmstr); }else{ name.put("室友",r+"\n\r"+nmstr); } }elseif(nl!=-1){ name.put("老鄉(xiāng)",l+"\n\r"+nmstr); }\\將新信息添加在個數(shù)據(jù)中 Stringstrnm=name.get(nname); name.put(nname,strnm+nmstr); al.add(nname);\\將更新數(shù)據(jù)寫入文件 try{ ObjectOutputStreamoo=newObjectOutputStream(newFileOutputStream(f)); oo.writeObject(name); oo.writeObject(al); s=s.replaceAll(omstr,nmstr); oo.writeObject(s); oo.close(); }catch(IOExceptione2){ } }\\創(chuàng)建對話框,提示修改成功,詢問用戶是否繼續(xù)修改 JLabelcsjl=newJLabel("更改成功!是否繼續(xù)更改?",JLabel.CENTER); JButtoncsYjb=newJButton("是"); changebtnMonitorcsYrm=newchangebtnMonitor(jf,f); csYjb.addActionListener(csYrm); csYMonitorcsYm=newcsYMonitor(); csYjb.addActionListener(csYm);\\添加兩個監(jiān)聽器用來完成關(guān)閉和重新打開更改界面動作 JButtonNjb=newJButton("否"); NMonitorNm=newNMonitor(); Njb.addActionListener(Nm); changejd.dispose(); csjd.setVisible(true); }classcsYMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ csjd.dispose(); }} classNMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ csjd.dispose(); jf.setVisible(true); } }}classCMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ changejd.dispose(); jf.setVisible(true); }}3.2.3添加的實現(xiàn)在此界面中,給用戶提供多個填寫欄和選擇鈕,用以完善信息。而對于重名的信息來說,字符串直接連接信息,不會受到影響,而當(dāng)在HashMap中,為了不掩蓋原有的值,則采用與關(guān)系鍵值添加的方法,在值后面在連接上信息的信息。添加的主要代碼如下:構(gòu)造方法與第一個功能一樣 publicvoidactionPerformed(ActionEvente){ addjd=newJDialog(jf); GridLayoutadgl=newGridLayout(9,1,0,5);\\將此界面劃分為九行一列\(zhòng)\添加個信息填寫欄和選擇項 JLabelNajl=newJLabel("姓名:"); Najt=newJTextField();\\創(chuàng)建男女單選項 JLabelsxjl=newJLabel("性別:"); Majr=newJRadioButton("男"); MjMonitorMjm=newMjMonitor(); Majr.addActionListener(Mjm); Fejr=newJRadioButton("女"); FjMonitorFjm=newFjMonitor(); Fejr.addActionListener(Fjm); ButtonGroupbg=newButtonGroup();\\將男女選擇按鈕放在一組形成單選,選擇一個,另一個就為空 bg.add(Majr); bg.add(Fejr); JLabelRejl=newJLabel("關(guān)系:");\\創(chuàng)建關(guān)系多選框,可以選擇多種關(guān)系 cjc=newJCheckBox("同學(xué)"); rjc=newJCheckBox("室友"); ljc=newJCheckBox("老鄉(xiāng)"); JLabelTpjl=newJLabel("電話:"); Tpjt=newJTextField(); JLabelPhjl=newJLabel("手機:"); Phjt=newJTextField(); JLabelAdjl=newJLabel("地址:"); Adjt=newJTextField(); JLabelPsjl=newJLabel("郵編:"); Psjt=newJTextField(); JLabelEmjl=newJLabel("E-mail:"); Emjt=newJTextField(); String[]str={"","@","@163.com","@126.com","@"};\\創(chuàng)建郵箱種類下拉菜單供用戶選擇 Emjcb=newJComboBox<Object>(str); JButtonsajb=newJButton("保存"); saMonitorsam=newsaMonitor(); sajb.addActionListener(sam); JButtoncajb=newJButton("取消"); caMonitorcam=newcaMonitor(); cajb.addActionListener(cam);\\判斷選了哪幾種關(guān)系 classsaMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ if(cjc.isSelected()){ if(rjc.isSelected()||ljc.isSelected()){ stcc=cjc.getText()+"、"; } else{ stcc=cjc.getText(); } }else{ stcc=""; } if(rjc.isSelected()){ if(ljc.isSelected()){ stcr=rjc.getText()+"、"; } else{ stcr=rjc.getText(); } }else{ stcr=""; } if(ljc.isSelected()){ stcl=ljc.getText(); }else{ stcl=""; } stcs=stcc+stcr+stcl;\\將關(guān)系組合 HashMap<String,String>name1=newHashMap<String,String>(); ArrayList<String>al=newArrayList<String>(); Strings=""; try{ FileInputStreamfi=newFileInputStream(f); ObjectInputStreamoi=newObjectInputStream(fi); name1=(HashMap<String,String>)oi.readObject(); al=(ArrayList<String>)oi.readObject(); s=(String)oi.readObject(); fi.close(); oi.close(); }catch(IOExceptione2){//當(dāng)最開始文件中沒有任何信息時要對文件數(shù)據(jù)初始化,相關(guān)代碼如下: try{ name1.put("室友",""); name1.put("同學(xué)",""); name1.put("老鄉(xiāng)",""); name1.put("同學(xué)、室友",""); name1.put("室友、老鄉(xiāng)",""); name1.put("同學(xué)、老鄉(xiāng)",""); name1.put("同學(xué)、室友、老鄉(xiāng)",""); al.add(""); ObjectOutputStreamoo=newObjectOutputStream(newFileOutputStream(f)); oo.writeObject(name1); oo.writeObject(al); oo.writeObject(s+name1.get(Najt.getText())+"\n\r"); oo.close(); }catch(IOExceptione1){ } }catch(ClassNotFoundExceptione2){ } Stringstr="姓名:"+Najt.getText()+"\n\r"+"性別:"+stx+"\n\r"+"關(guān)系:"+stcs+"\n\r"+"電話:"+Tpjt.getText()+"\n\r"+"手機:"+Phjt.getText()+"\n\r"+"地址:"+Adjt.getText()+"\n\r"+"郵編:"+Psjt.getText()+"\n\r"+"E-mail:"+Emjt.getText()+Emjcb.getSelectedItem()+"\n\r";\\將各類信息組成一個信息串 ssjd=newJDialog(); ssjl=newJLabel("保存成功!是否繼續(xù)添加?",ssjl.CENTER);\\當(dāng)添加成功時會彈出一個對話框提示用戶,并詢問是否繼續(xù)添加 ssYjb=newJButton("是"); addbtnMonitorssYrem=newaddbtnMonitor(jf,f); ssYjb.addActionListener(ssYrem); ssYMonitorssYm=newssYMonitor(); ssYjb.addActionListener(ssYm); ssNjb=newJButton("否"); ssNMonitorssNm=newssNMonitor(); ssNjb.addActionListener(ssNm);\\將信息添加到所包含的關(guān)系的鍵所對應(yīng)的值后,代碼如下: Stringsrc=name1.get("同學(xué)"); Stringsrcr=name1.get("同學(xué)、室友"); Stringsrcl=name1.get("同學(xué)、老鄉(xiāng)"); Stringsrcrl=name1.get("同學(xué)、室友、老鄉(xiāng)"); Stringsrr=name1.get("室友"); Stringsrrl=name1.get("室友、老鄉(xiāng)"); Stringsrl=name1.get("老鄉(xiāng)");\\獲取各關(guān)系的原始值 intt2=stcs.indexOf("同學(xué)"); ints2=stcs.indexOf("室友"); intl2=stcs.indexOf("老鄉(xiāng)"); if(t2!=-1){ if(s2!=-1){ if(l2!=-1){ name1.put("同學(xué)",src+"\n\r"+str); name1.put("室友",srr+"\n\r"+str); name1.put("老鄉(xiāng)",srl+"\n\r"+str); name1.put("同學(xué)、室友",srcr+"\n\r"+str); name1.put("同學(xué)、室友、老鄉(xiāng)",srcrl+"\n\r"+str); name1.put("同學(xué)、老鄉(xiāng)",srcl+"\n\r"+str); name1.put("室友、老鄉(xiāng)",srrl+"\n\r"+str); } else{ name1.put("同學(xué)",src+"\n\r"+str); name1.put("室友",srr+"\n\r"+str); name1.put("同學(xué)、室友",srcr+"\n\r"+str); } }elseif(l2!=-1){ name1.put("同學(xué)",src+"\n\r"+str); name1.put("老鄉(xiāng)",srl+"\n\r"+str); name1.put("同學(xué)、老鄉(xiāng)",srcl+"\n\r"+str); }else{ name1.put("同學(xué)",src+"\n\r"+str); } }elseif(s2!=-1){ if(l2!=-1){ name1.put("室友",srr+"\n\r"+str); name1.put("老鄉(xiāng)",srl+"\n\r"+str); name1.put("室友、老鄉(xiāng)",srrl+"\n\r"+str); }else{ name1.put("室友",srr+"\n\r"+str); } }elseif(l2!=-1){ name1.put("老鄉(xiāng)",srl+"\n\r"+str); }\\當(dāng)添加姓名鍵時,先判斷是否有重名。當(dāng)出現(xiàn)重名情況時,則不再添加姓名鍵,而是在原有的姓名鍵所對應(yīng)的值后直接連接信息,不是重名則直接添加新鍵和新值,代碼如下:if(name1.get(Najt.getText())!=null){\\判斷是否有重名 Stringstrho=name1.get(Najt.getText());\\獲取已有鍵的值 name1.put(Najt.getText(),strho+str);\\追加新值 }else{ name1.put(Najt.getText(),str); } al.add(Najt.getText()); try{ ObjectOutputStreamoo=newObjectOutputStream(newFileOutputStream(f)); oo.writeObject(name1); oo.writeObject(al); intali=al.size()-1;\\獲取此姓名的位置 oo.writeObject(s+"序號"+ali+"\n\r"+str+"\n\r");\\編號 oo.close(); }catch(IOExceptione1){ } ssjd.setVisible(true); addjd.dispose(); } classssYMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ ssjd.dispose(); } } classssNMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ ssjd.dispose(); jf.setVisible(true); } } } classcaMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ addjd.dispose(); jf.setVisible(true); } }3.2.4刪除的實現(xiàn)輸入姓名,將指定姓名的信息全部刪除。主要代碼如下:構(gòu)造方法與第一個功能一樣 publicvoidactionPerformed(ActionEvente){ Najl=newJLabel("請輸入要刪除的人:",Najl.CENTER);\\創(chuàng)建搜索姓名框與修改的相同 try{ FileInputStreamfi=newFileInputStream(f); ObjectInputStreamoi; oi=newObjectInputStream(fi); name1=newHashMap<String,String>(); name1=(HashMap<String,String>)oi.readObject(); al=newArrayList<String>(); al=(ArrayList<String>)oi.readObject(); s2=(String)oi.readObject(); fi.close(); oi.close(); }catch(IOExceptione1){ deljd.dispose();\\當(dāng)文件沒數(shù)據(jù)時將會提示用戶 Mijd=newJDialog(); JLabelMijl=newJLabel("此通訊錄為空請返回",JLabel.CENTER); JButtonMirebtn=newJButton("返回"); MireMonitormm=newMireMonitor(); Mirebtn.addActionListener(mm); Mijd.setVisible(true); }catch(ClassNotFoundExceptione1){ } jf.setVisible(false); } classMireMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ Mijd.dispose(); jf.setVisible(true); } } classdelYMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ if(s2.indexOf(Naja.getText().trim())==-1){\\如果沒有此人會提示重新確認 delsjd=newJDialog(); GridLayoutdelsgl=newGridLayout(2,1); delsjl=newJLabel("查無此人請重新確認",JLabel.CENTER); JButtondsrejb=newJButton("返回"); delbtnMonitordsrem=newdelbtnMonitor(jf,f); dsrejb.addActionListener(dsrem); dsYMonitordrm=newdsYMonitor(); dsrejb.addActionListener(drm); }else{\\因為涉及到一個人名有多個信息,所以包含的關(guān)系可能不同,所以要一組一組信息地看,代碼如下: for(;name1.get("同學(xué)").indexOf(Naja.getText())!=-1;){\\與關(guān)系匹配清除相關(guān)信息 intdelbe=name1.get("同學(xué)").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("同學(xué)").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("同學(xué)").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("同學(xué)").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("同學(xué)",name1.get("同學(xué)").replaceAll(name1.get("同學(xué)").substring(delbe,delen+2),"")); } for(;name1.get("同學(xué)、室友").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("同學(xué)、室友").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("同學(xué)、室友").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("同學(xué)、室友").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("同學(xué)、室友").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("同學(xué)、室友",name1.get("同學(xué)、室友").replaceAll(name1.get("同學(xué)、室友").substring(delbe,delen+2),"")); } for(;name1.get("同學(xué)、老鄉(xiāng)").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("同學(xué)、老鄉(xiāng)").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("同學(xué)、老鄉(xiāng)").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("同學(xué)、老鄉(xiāng)").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("同學(xué)、老鄉(xiāng)").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("同學(xué)、老鄉(xiāng)",name1.get("同學(xué)、老鄉(xiāng)").replaceAll(name1.get("同學(xué)、老鄉(xiāng)").substring(delbe,delen+2),"")); } for(;name1.get("室友、老鄉(xiāng)").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("室友、老鄉(xiāng)").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("室友、老鄉(xiāng)").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("室友、老鄉(xiāng)").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("室友、老鄉(xiāng)").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("室友、老鄉(xiāng)",name1.get("室友、老鄉(xiāng)").replaceAll(name1.get("室友、老鄉(xiāng)").substring(delbe,delen+2),"")); } for(;name1.get("室友").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("室友").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("室友").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("室友").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("室友").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("室友",name1.get("室友").replaceAll(name1.get("室友").substring(delbe,delen+2),"")); } for(;name1.get("老鄉(xiāng)").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("老鄉(xiāng)").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("老鄉(xiāng)").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("老鄉(xiāng)").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("老鄉(xiāng)").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("老鄉(xiāng)",name1.get("老鄉(xiāng)").replaceAll(name1.get("老鄉(xiāng)").substring(delbe,delen+2),"")); } for(;name1.get("同學(xué)、室友、老鄉(xiāng)").indexOf(Naja.getText())!=-1;){ intdelbe=name1.get("同學(xué)、室友、老鄉(xiāng)").indexOf(Naja.getText()); for(;delbe!=-1;delbe--){ if(name1.get("同學(xué)、室友、老鄉(xiāng)").charAt(delbe)=='姓'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(name1.get("同學(xué)、室友、老鄉(xiāng)").substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(name1.get("同學(xué)、室友、老鄉(xiāng)").substring(delen,delen+2).equals("\n\r")){ break; } } break; } } name1.put("同學(xué)、室友、老鄉(xiāng)",name1.get("同學(xué)、室友、老鄉(xiāng)").replaceAll(name1.get("同學(xué)、室友、老鄉(xiāng)").substring(delbe,delen+2),"")); } ObjectOutputStreamoo2; try{ oo2=newObjectOutputStream(newFileOutputStream(f)); StringstrNa=name1.get(Naja.getText()); name1.remove(Naja.getText());\\檢驗是否是同名多信息,并在刪除后讓序號前移 for(;s2.indexOf(Naja.getText())!=-1;){ intdelbe=s2.indexOf(Naja.getText()); intnnp=al.indexOf(Naja.getText()); al.remove(Naja.getText()); intnanl=al.size(); for(;delbe!=-1;delbe--){ if(s2.charAt(delbe)=='序'){ break; } } intdelen=0; for(delen=delbe+1;delen!=-1;delen++){ if(s2.substring(delen,delen+6).equals("E-mail")){ for(;;delen++){ if(s2.substring(delen,delen+2).equals("\n\r")){ break; } } break; } } Stringdelstr=s2.substring(delbe,delen+2); s2=s2.replaceAll(delstr+"\n\r",""); for(;nnp<nanl;nnp++){\\對序號進行重新排序 intfidbe=0; if(delbe<s2.lenth()-1){ fidbe=delbe; } intfiden=0; for(fiden=fidbe+1;fiden!=-1;fiden++){ if(s2.charAt(fiden)=='\n'){ break; } } Stringfidstr=s2.substring(fidbe+2,fiden); s2=s2.replaceAll(fidstr,""+nnp); } } oo2.writeObject(name1); oo2.writeObject(al); oo2.writeObject(s2); oo2.close(); }catch(FileNotFoundExceptione1){ }catch(IOExceptione1){ } delsjd=newJDialog();\\設(shè)置刪除成功對話框 delsjl=newJLabel("刪除成功!是否繼續(xù)刪除?",JLabel.CENTER); JButtondsYjb=newJButton("是"); delbtnMonitordsYrem=newdelbtnMonitor(jf,f); dsYjb.addActionListener(dsYrem); dsYMonitordsYm=newdsYMonitor(); dsYj
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深信服aES產(chǎn)品技術(shù)白皮書-V1.5
- 3.3汽化和液化 說課稿2025年初中人教版物理八年級上冊
- 我奮斗我幸福心得體會
- 積極心理學(xué)理論下護理在細菌性陰道炎患者中的應(yīng)用
- 《會計信息系統(tǒng)應(yīng)用》課件 學(xué)習(xí)情境5 薪資管理系統(tǒng)應(yīng)用
- 餐廚垃圾收運合作協(xié)議書
- 二零二五圖書倉儲與倉儲物流信息化合同樣本
- 二零二五年度辦公大樓自來水供應(yīng)與智能抄表服務(wù)合同
- 健康飲食規(guī)劃實踐指南
- 三農(nóng)村資源利用優(yōu)化方案設(shè)計
- 煙草職業(yè)鑒定三級技能考點
- 2024年江西應(yīng)用工程職業(yè)學(xué)院單招職業(yè)技能測試題庫標準卷
- 希望之星小學(xué)組小低組評委問答、即興問答環(huán)節(jié)答題技巧及全部題庫
- 幼兒園春季傳染病預(yù)防知識課件
- GB/T 11067.1-2006銀化學(xué)分析方法銀量的測定氯化銀沉淀-火焰原子吸收光譜法
- GA 857-2009貨物運輸微劑量X射線安全檢查設(shè)備通用技術(shù)要求
- 學(xué)校食堂食品安全自查自評表
- 管道防腐檢驗批質(zhì)量驗收記錄
- 出口商業(yè)發(fā)票范本
- (本科)東南亞經(jīng)濟與貿(mào)易全套教學(xué)課件完整版PPT
- 《村級財務(wù)管理培訓(xùn)》PPT課件
評論
0/150
提交評論