版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章課題概述本次Java課程設(shè)計(jì)題目是設(shè)計(jì)一個(gè)學(xué)生通訊錄,可以進(jìn)行顯示全部、修改、添加、刪除、查找、排序操作。1.1課題目的通訊錄是很普遍和實(shí)用的程序,它幫助人們記錄大量信息,并供人們查找修改等。有了通訊錄,人們可以更加快捷方便地查詢到自己想要的人物信息。這就會(huì)節(jié)約人們很多時(shí)間,比起紙質(zhì)的來(lái)說(shuō),這個(gè)更加高效。此學(xué)生通訊錄用來(lái)記載每位同學(xué)的具體信息,如果當(dāng)用戶需要某位同學(xué)的信息的時(shí)候,可以通過(guò)查找迅速找到相關(guān)信息,也可以往其中不斷添加新的學(xué)生。通過(guò)這些,來(lái)替自己管理學(xué)生信息,自然擁有很大的實(shí)際價(jià)值。1.2課題要求1.2.1輸入輸出要求=1\*GB2⑴程序運(yùn)行后應(yīng)先輸出一個(gè)圖形界面菜單,其中有顯示全部、修改、添加、刪除、查找、排序功能來(lái)供用戶選擇,以便用戶需求。=2\*GB2⑵用戶在使用完一個(gè)功能后,可以返回到主界面,并且數(shù)據(jù)也在隨時(shí)更新。=3\*GB2⑶用戶在對(duì)通訊錄進(jìn)行添加、修改或是刪除時(shí),在實(shí)現(xiàn)完相應(yīng)功能后,會(huì)保存到文件中,并在下次顯示信息時(shí)有相應(yīng)信息。=4\*GB2⑷當(dāng)用戶進(jìn)行添加、修改或是刪除時(shí),在實(shí)現(xiàn)完相應(yīng)功能后,會(huì)讓文件中的信息立即更新,在不必重新運(yùn)行程序的情況下,就可以即時(shí)顯示最新信息。1.2.2程序?qū)崿F(xiàn)功能要求=1\*GB2⑴顯示全部功能需要顯示所有已添加學(xué)生的信息,將文件中所保存的學(xué)生信息反序列化,然后將其以字符串的形式顯示在文本域中。=2\*GB2⑵修改功能需要顯示出用戶指定人物的信息,并允許用戶對(duì)這些信息進(jìn)行修改,在用戶修改完畢后,能夠?qū)⑽募邢鄳?yīng)人物的信息更新為修改后的信息,將原有的信息消除。=3\*GB2⑶添加功能需要顯示一個(gè)包括姓名、性別、關(guān)系、電話、手機(jī)、地址、郵編、E-mail的信息添加項(xiàng),并可以讓用戶逐一或者選擇添加,在添加完成后將新的信息添加到文件中,并對(duì)其進(jìn)行編號(hào),即使程序重新啟動(dòng)也依然會(huì)顯示相應(yīng)信息。=4\*GB2⑷刪除功能需要尋找到用戶所指定的人物信息,并將其的所有信息在文件中移除。=5\*GB2⑸查找功能需要為用戶提供兩種查找方式,一種為按姓名查找,另一種為按關(guān)系查找,并且當(dāng)用戶根據(jù)提示進(jìn)行相關(guān)操作后可以只顯示出自己所需要的信息。=6\*GB2⑹排序功能需要實(shí)現(xiàn)將已有的人物信息,按照人物姓名拼音字母的順尋進(jìn)行排序,并且將排序好的名字的信息按順序顯示出來(lái)。
第2章概要設(shè)計(jì)2.1整個(gè)程序的模塊結(jié)構(gòu)及流程根據(jù)課題要求,整個(gè)程序按功能可劃分為顯示全部、修改、添加、刪除、查找、排序這六個(gè)主要模塊。并在除顯示全部和查找模塊只有文件的讀取外,其它四個(gè)模塊都有文件的讀取與寫入模塊,方便文件的及時(shí)更新。除了這六個(gè)模塊外,為了讓用戶使用起來(lái)更加簡(jiǎn)單明確,還添加了一些提示性的對(duì)話框。并且還為每一個(gè)功能的窗口都提供了返回主界面的按鈕,方便用戶在不同功能之間來(lái)回使用。圖2-1整個(gè)程序各功能模塊間的流程2.2信息的存儲(chǔ)方式用戶在用完一系列功能后,不能讓數(shù)據(jù)僅僅保存在內(nèi)存中,在退出程序再重新打開查看時(shí)信息應(yīng)該還在。這就需要將數(shù)據(jù)存在文件中,當(dāng)用戶再次查看時(shí)程序?qū)?huì)讀取文件中的信息,這樣就能保證數(shù)據(jù)的持久性。當(dāng)完成添加、刪除或修改功能后,需要更新數(shù)據(jù),也就是在向文件中寫入新信息。因?yàn)樯婕暗桨葱彰檎液桶搓P(guān)系查找這兩個(gè)功能,所以要采用HashMap這個(gè)類對(duì)信息進(jìn)行存儲(chǔ)。因?yàn)樾彰完P(guān)系是索引,所以將這兩項(xiàng)分別作為鍵,將具體信息分別作為這兩個(gè)鍵的值。因?yàn)榫庉嬓蛱?hào)以及排序功能的需要,還要將姓名存在ArrayList中。如果直接用HashMap來(lái)在文本域中顯示信息的話,會(huì)在重名的時(shí)候無(wú)法按順序顯示,所以還要用字符串對(duì)信息進(jìn)行保存。最后將將這三類對(duì)象寫入文件中,如此就完成了對(duì)于數(shù)據(jù)的更新和保存。2.3數(shù)據(jù)讀取與數(shù)據(jù)初步處理當(dāng)在使用某個(gè)功能時(shí),程序會(huì)將文件中的數(shù)據(jù)讀取。由于在寫入文件時(shí)是按三種對(duì)象寫的,所以在讀取的時(shí)候也要一一對(duì)應(yīng),這樣就可以將文件中的數(shù)據(jù)準(zhǔn)確無(wú)誤的讀入內(nèi)存,以備使用。用戶輸入的信息是字符串,并且窗口顯示出的信息也同樣是字符串,所以就要給HashMap和ArrayList用上泛型,也就是HashMap<String><String>和ArrayList<String>,這樣就可以避免在添加信息或是在類型轉(zhuǎn)換的時(shí)候發(fā)生錯(cuò)誤。2.4各功能的設(shè)計(jì)思路描述2.4.1顯示全部功能顯示全部功能就是將所有文件中的學(xué)生信息一次性展示出來(lái)。因?yàn)閷?shí)在文件中的數(shù)據(jù),所以要先要有對(duì)文件進(jìn)行讀取的動(dòng)作,之后將所讀取出的信息的字符串顯示在文本域中。如果在文件中沒(méi)有任何人物信息,則需要在文本域中顯示相應(yīng)提示,告知用戶這個(gè)通訊錄為空。2.4.2修改功能修改功能的實(shí)質(zhì)就是將就有的信息替換為新的信息,就是字符串內(nèi)容的替換。首先,要讀取文件數(shù)據(jù),然后找到用戶所想要改的人物信息,并將其顯示在文本域中,然后用戶根據(jù)自己的需求進(jìn)行修改,如果沒(méi)有此人,測(cè)顯示查無(wú)此人。在修改結(jié)束后,將舊有的信息刪除,將修改好的信息重新寫入文件。2.4.3添加功能添加功能是所有功能的基礎(chǔ),全都靠它來(lái)規(guī)范數(shù)據(jù)。首先,添加功能要在窗口中依次顯示姓名、性別、關(guān)系、電話、手機(jī)、地址、郵編、E-mail這幾項(xiàng)信息欄供用戶來(lái)添加。并且當(dāng)用戶沒(méi)有添加人名或關(guān)系時(shí)要有所提示。而性別和關(guān)系是指定的幾項(xiàng),來(lái)供用戶進(jìn)行選擇。而對(duì)于E-mail的地址,郵箱類型時(shí)也會(huì)給用戶進(jìn)行選擇,也可讓用戶自行填寫。當(dāng)用戶完成添加之后,可以及時(shí)保存到文件中,并且會(huì)提示用戶是否還要繼續(xù)添加,是則返回刪除界面,否則返回主界面。2.4.4刪除功能刪除功能能在文件中消除用戶指定的人物的信息。在刪除界面,要提供給用戶一個(gè)填寫名字的文本域,然后程序根據(jù)所填寫人名在文件中進(jìn)行搜索,并將其刪除。如果在文件中沒(méi)有找到此人名,將會(huì)彈出一個(gè)新窗口提示用戶沒(méi)有此人。當(dāng)刪除結(jié)束后,將會(huì)提示用戶是否要繼續(xù)刪除,是則返回刪除界面,否則返回主界面。2.4.5查找功能查找功能是將用戶想要的信息顯示出來(lái)。查找功能分為按姓名查找和安關(guān)系查找方式。按姓名查找是用戶輸入一個(gè)人名,然后程序在文件中搜索,然后在文本域中顯示相關(guān)信息。如果沒(méi)有此人,則要提示用戶查無(wú)此人。按關(guān)系查找是給用戶三個(gè)選擇項(xiàng),分別是“同學(xué)”、“室友”、“老鄉(xiāng)”。用戶可以選一個(gè)或是多個(gè)關(guān)系,當(dāng)用戶選擇完畢確定后,將在文本域中顯示此關(guān)系下的所有人物信息。2.4.6排序功能排序功能是將信息按指定順序依次列出。在本程序中是按姓名的漢語(yǔ)拼音從a到z依次顯示。先將所有姓名按照此順序排好,然后再依次輸出對(duì)應(yīng)名字的信息。
第3章程序功能的實(shí)現(xiàn)3.1主界面的實(shí)現(xiàn)主界面有六個(gè)按鈕,分別是顯示全部、修改、添加、刪除、查找、排序。中間是歡迎使用字樣,為每個(gè)按鈕添加監(jiān)聽器。當(dāng)運(yùn)行時(shí),調(diào)用主方法就會(huì)出現(xiàn)主界面。主界面的主要代碼如下: Filef=newFile("D:/MailList.dat"); publicMainFrm(){ Mainf=newJFrame("學(xué)生通訊錄");\\主窗口界面,在標(biāo)題欄寫有"學(xué)生通訊錄"字樣\\對(duì)界面布局 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)建六個(gè)功能按鈕 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);\\添加點(diǎn)擊監(jiān)聽器 Mainf.setDefaultCloseOperation(Mainf.EXIT_ON_CLOSE); Mainf.setVisible(true); }publicstaticvoidmain(String[]args){ newMainFrm();\\主方法,用于顯示主界面}3.2主要功能模塊的實(shí)現(xiàn)3.2.1顯示全部的實(shí)現(xiàn)首先要構(gòu)建一個(gè)子窗口,然后指定文件和主窗口。在顯示全部界面中,添加一個(gè)文本域用于顯示全部信息,最下方有一個(gè)返回鍵用于返回主界面。顯示全部的主要代碼如下: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("此通訊簿為空");\\如果沒(méi)有數(shù)據(jù)就要提醒用戶 } js.setVerticalScrollBarPolicy(js.VERTICAL_SCROLLBAR_AS_NEEDED); js.setHorizontalScrollBarPolicy(js.HORIZONTAL_SCROLLBAR_AS_NEEDED);\\設(shè)置文本域有橫縱滾動(dòng)條,在需要的時(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è)置返回按鈕動(dòng)作,按下后此界面關(guān)閉,主界面出現(xiàn)classAllreMonitorimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ jf.setVisible(true); Alljd.dispose(); }}3.2.2修改的實(shí)現(xiàn)當(dāng)用戶輸入指定名字時(shí),程序?qū)ξ募?nèi)容進(jìn)行搜索,讓后在文本域中顯示相應(yīng)信息,用戶自行改寫,當(dāng)該寫好后,點(diǎn)擊按鈕保存,然后會(huì)跳出有一個(gè)對(duì)話框詢問(wèn)用戶是否繼續(xù)修改。修改的主要代碼如下:構(gòu)造方法與第一個(gè)功能一樣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("請(qǐng)輸入");Najt=newJTextField();Yjb=newJButton("確定");YMonitorYm=newYMonitor();Yjb.addActionListener(Ym);JLabelcgjl=newJLabel("請(qǐng)修改");Meja=newJTextArea();js.setHorizontalScrollBarPolicy(js.HORIZONTAL_SCROLLBAR_AS_NEEDED);\\設(shè)置文本域中的滾動(dòng)條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);\\將最下方兩個(gè)按鍵一欄設(shè)為流式布局YCjp.setLayout(YCfl);Mejp.add(YCjp,Mebl.SOUTH);\\將提示新信息放北區(qū),文本域放在中間,取消按鈕放在南區(qū)jf.setVisible(false);\\此界面下,主界面隱藏changejd.setVisible(true);}\\設(shè)置確定姓名按鈕動(dòng)作,當(dāng)按下此按鈕后,程序會(huì)根據(jù)相應(yīng)的姓名鍵,去找它在HashMap中所對(duì)應(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){\\如果沒(méi)有填寫名字將會(huì)提示用戶輸入 Meja.setText("請(qǐng)先輸入姓名"); }elseif(s.indexOf(Najt.getText().trim())==-1){\\如果找不到此姓名,則會(huì)告知用戶此人不存在 Najt.setText(""); Meja.setText("查無(wú)此人"); Meja.setEditable(false); }else{\\找到此姓名,將此姓名對(duì)應(yīng)的信息顯示在文本域中,并初始輸入名欄 Meja.setText(name.get(Najt.getText().trim())); Meja.setEditable(true); Najt.setText(""); } }catch(ClassNotFoundExceptione1){ }catch(IOExceptione1){\\如果通訊錄為空則會(huì)給用戶提示 Najt.setText(""); Meja.setText("此通訊簿為空"); } } }\\設(shè)置確定更改按鈕動(dòng)作,按下后就有的信息將會(huì)清除,而會(huì)加上修改后的信息classYcMonitorimplementsActionListener{ JDialogcsjd; publicvoidactionPerformed(ActionEvente){ Stringnname=null; Stringmg=Meja.getText();\\循環(huán)結(jié)構(gòu),來(lái)防止重名人物信息不能有效更改,將每一個(gè)姓名中的每一條信息分開,單獨(dú)操作 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ù)第二個(gè)位置 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); }\\將新信息添加在個(gè)數(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)建對(duì)話框,提示修改成功,詢問(wèn)用戶是否繼續(xù)修改 JLabelcsjl=newJLabel("更改成功!是否繼續(xù)更改?",JLabel.CENTER); JButtoncsYjb=newJButton("是"); changebtnMonitorcsYrm=newchangebtnMonitor(jf,f); csYjb.addActionListener(csYrm); csYMonitorcsYm=newcsYMonitor(); csYjb.addActionListener(csYm);\\添加兩個(gè)監(jiān)聽器用來(lái)完成關(guān)閉和重新打開更改界面動(dòng)作 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添加的實(shí)現(xiàn)在此界面中,給用戶提供多個(gè)填寫欄和選擇鈕,用以完善信息。而對(duì)于重名的信息來(lái)說(shuō),字符串直接連接信息,不會(huì)受到影響,而當(dāng)在HashMap中,為了不掩蓋原有的值,則采用與關(guān)系鍵值添加的方法,在值后面在連接上信息的信息。添加的主要代碼如下:構(gòu)造方法與第一個(gè)功能一樣 publicvoidactionPerformed(ActionEvente){ addjd=newJDialog(jf); GridLayoutadgl=newGridLayout(9,1,0,5);\\將此界面劃分為九行一列\(zhòng)\添加個(gè)信息填寫欄和選擇項(xiàng) JLabelNajl=newJLabel("姓名:"); Najt=newJTextField();\\創(chuàng)建男女單選項(xiàng) JLabelsxjl=newJLabel("性別:"); Majr=newJRadioButton("男"); MjMonitorMjm=newMjMonitor(); Majr.addActionListener(Mjm); Fejr=newJRadioButton("女"); FjMonitorFjm=newFjMonitor(); Fejr.addActionListener(Fjm); ButtonGroupbg=newButtonGroup();\\將男女選擇按鈕放在一組形成單選,選擇一個(gè),另一個(gè)就為空 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("手機(jī):"); 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)最開始文件中沒(méi)有任何信息時(shí)要對(duì)文件數(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"+"手機(jī):"+Phjt.getText()+"\n\r"+"地址:"+Adjt.getText()+"\n\r"+"郵編:"+Psjt.getText()+"\n\r"+"E-mail:"+Emjt.getText()+Emjcb.getSelectedItem()+"\n\r";\\將各類信息組成一個(gè)信息串 ssjd=newJDialog(); ssjl=newJLabel("保存成功!是否繼續(xù)添加?",ssjl.CENTER);\\當(dāng)添加成功時(shí)會(huì)彈出一個(gè)對(duì)話框提示用戶,并詢問(wèn)是否繼續(xù)添加 ssYjb=newJButton("是"); addbtnMonitorssYrem=newaddbtnMonitor(jf,f); ssYjb.addActionListener(ssYrem); ssYMonitorssYm=newssYMonitor(); ssYjb.addActionListener(ssYm); ssNjb=newJButton("否"); ssNMonitorssNm=newssNMonitor(); ssNjb.addActionListener(ssNm);\\將信息添加到所包含的關(guān)系的鍵所對(duì)應(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)添加姓名鍵時(shí),先判斷是否有重名。當(dāng)出現(xiàn)重名情況時(shí),則不再添加姓名鍵,而是在原有的姓名鍵所對(duì)應(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+"序號(hào)"+ali+"\n\r"+str+"\n\r");\\編號(hào) 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刪除的實(shí)現(xiàn)輸入姓名,將指定姓名的信息全部刪除。主要代碼如下:構(gòu)造方法與第一個(gè)功能一樣 publicvoidactionPerformed(ActionEvente){ Najl=newJLabel("請(qǐng)輸入要?jiǎng)h除的人:",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)文件沒(méi)數(shù)據(jù)時(shí)將會(huì)提示用戶 Mijd=newJDialog(); JLabelMijl=newJLabel("此通訊錄為空請(qǐng)返回",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){\\如果沒(méi)有此人會(huì)提示重新確認(rèn) delsjd=newJDialog(); GridLayoutdelsgl=newGridLayout(2,1); delsjl=newJLabel("查無(wú)此人請(qǐng)重新確認(rèn)",JLabel.CENTER); JButtondsrejb=newJButton("返回"); delbtnMonitordsrem=newdelbtnMonitor(jf,f); dsrejb.addActionListener(dsrem); dsYMonitordrm=newdsYMonitor(); dsrejb.addActionListener(drm); }else{\\因?yàn)樯婕暗揭粋€(gè)人名有多個(gè)信息,所以包含的關(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());\\檢驗(yàn)是否是同名多信息,并在刪除后讓序號(hào)前移 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++){\\對(duì)序號(hào)進(jìn)行重新排序 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è)置刪除成功對(duì)話框 delsjl=newJLabel("刪除成功!是否繼續(xù)刪除?",JLabel.CENTER); JButtondsYjb=newJButton("是"); delbtnMonitordsYrem=newdelbtnMonitor(jf,f); dsYjb.addActionListener(dsYrem); dsYMonitordsYm=newdsYMonitor(); dsYj
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)機(jī)租賃市場(chǎng)準(zhǔn)入合同范本資訊4篇
- 二零二五版拌合料生產(chǎn)技術(shù)改造與升級(jí)合同4篇
- 二零二五版建筑工地勞務(wù)用工與綠色施工技術(shù)研發(fā)與推廣合同3篇
- 二零二五版舊設(shè)備買賣及拆解回收再利用合同3篇
- 2025年度綠色交通募集資金三方監(jiān)管與執(zhí)行合同4篇
- 二零二五年度少兒興趣班教室租賃及教學(xué)用品供應(yīng)合同4篇
- 二零二五年度科技園區(qū)場(chǎng)地租賃及研發(fā)合作合同4篇
- 關(guān)于2025年度民法典規(guī)定協(xié)議離婚期限及法律支持4篇
- 二零二五年度智慧社區(qū)建設(shè)合同投標(biāo)單位保密保證
- 二零二五年度外架工程風(fēng)險(xiǎn)評(píng)估與控制服務(wù)合同
- 物業(yè)民法典知識(shí)培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識(shí)點(diǎn)詳解
- 2024-2025學(xué)年八年級(jí)數(shù)學(xué)人教版上冊(cè)寒假作業(yè)(綜合復(fù)習(xí)能力提升篇)(含答案)
- 《萬(wàn)方數(shù)據(jù)資源介紹》課件
- 醫(yī)生定期考核簡(jiǎn)易程序述職報(bào)告范文(10篇)
- 第一章-地震工程學(xué)概論
- 《中國(guó)糖尿病防治指南(2024版)》更新要點(diǎn)解讀
- 初級(jí)創(chuàng)傷救治課件
- 交通運(yùn)輸類專業(yè)生涯發(fā)展展示
- 2024年山東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理專家共識(shí)(2024)解讀
評(píng)論
0/150
提交評(píng)論