Java课程设计--学生通讯录.docx
第1章课题概述11.1 课题目的11.2 课题要求11 .2.1输入输出要求12 .2.2程序实现功能要求1第2章概要设计32.1 整个程序的模块结构及流程32.2 信息的存储方式32.3 3数据读取与数据初步处理42. 4各功能的设计思路描述42. 4.1显示全部功能43. 4.2修改功能44. 4.3添加功能45. 4.4删除功能56. 4.5查找功能57. 4.6排序功能5第3章程序功能的实现63. 1主界面的实现63.2主要功能模块的实现73. 2.1显示全部的实现74. 2.2修改的实现85. 2.3添加的实现146. 2.4删除的实现197. 2.5查找的实现268. 2.6排序的实现30第4章调试及发现问题的解决32第5章程序测试及分析34第6章总结40参考文献41第1章课题概述本次JaVa课程设计题目是设计一个学生通讯录,可以进行显示全部、修改、添加、删除、查找、排序操作。1.1 课题目的通讯录是很普遍和实用的程序,它帮助人们记录大量信息,并供人们查找修改等。有了通讯录,人们可以更加快捷方便地查询到自己想要的人物信息。这就会节约人们很多时间,比起纸质的来说,这个更加高效。此学生通讯录用来记载每位同学的具体信息,如果当用户需要某位同学的信息的时候,可以通过查找迅速找到相关信息,也可以往其中不断添加新的学生。通过这些,来替自己管理学生信息,自然拥有很大的实际价值。1.2 课题要求1.2. 1输入输出要求程序运行后应先输出一个图形界面菜单,其中有显示全部、修改、添加、删除、查找、排序功能来供用户选择,以便用户需求。用户在使用完一个功能后,可以返回到主界面,并且数据也在随时更新。用户在对通讯录进行添加、修改或是删除时,在实现完相应功能后,会保存到文件中,并在下次显示信息时有相应信息。当用户进行添加、修改或是删除时,在实现完相应功能后,会让文件中的信息立即更新,在不必重新运行程序的情况下,就可以即时显示最新信息。1.2.2程序实现功能要求显示全部功能需要显示所有已添加学生的信息,将文件中所保存的学生信息反序列化,然后将其以字符串的形式显示在文本域中。修改功能需要显示出用户指定人物的信息,并允许用户对这些信息进行修改,在用户修改完毕后,能够将文件中相应人物的信息更新为修改后的信息,将原有的信息消除。添加功能需要显示一个包括姓名、性别、关系、电话、手机、地址、邮编、E-mail的信息添加项,并可以让用户逐一或者选择添加,在添加完成后将新的信息添加到文件中,并对其进行编号,即使程序重新启动也依然会显示相应信息。删除功能需要寻找到用户所指定的人物信息,并将其的所有信息在文件中移除。查找功能需要为用户提供两种查找方式,一种为按姓名查找,另一种为按关系查找,并且当用户根据提示进行相关操作后可以只显示出自己所需要的信息。排序功能需要实现将已有的人物信息,按照人物姓名拼音字母的顺寻进行排序,并且将排序好的名字的信息按顺序显示出来。第2草概要设计2.1 整个程序的模块结构及流程根据课题要求,整个程序按功能可划分为显示全部、修改、添加、删除、查找、排序这六个主要模块。并在除显示全部和查找模块只有文件的读取外,其它四个模块都有文件的读取与写入模块,方便文件的及时更新。除了这六个模块外,为了让用户使用起来更加简单明确,还添加了一些提示性的对话框。并且还为每一个功能的窗口都提供了返回主界面的按钮,方便用户在不同功能之间来回使用。关ffl主菜总退出程序显示所将息关闭显示全部修改显示指定信息让用户修改显示多个信息添加项,让用户添加将用户指定的信录文件中消除显示用户指定的信息将人名静音字母排序并显小信息图2-1整个程序各功能模块间的流程2.2 信息的存储方式用户在用完一系列功能后,不能让数据仅仅保存在内存中,在退出程序再重新打开查看时信息应该还在。这就需要将数据存在文件中,当用户再次查看时程序将会读取文件中的信息,这样就能保证数据的持久性。当完成添加、删除或修改功能后,需要更新数据,也就是在向文件中写入新信息。因为涉及到按姓名查找和按关系查找这两个功能,所以要采用HashMap这个类对信息进行存储。因为姓名和关系是索引,所以将这两项分别作为键,将具体信息分别作为这两个键的值。因为编辑序号以及排序功能的需要,还要将姓名存在AlTayLiSt中。如果直接用HaShMaP来在文本域中显示信息的话,会在重名的时候无法按顺序显示,所以还要用字符串对信息进行保存。最后将将这三类对象写入文件中,如此就完成了对于数据的更新和保存。2.3数据读取与数据初步处理当在使用某个功能时,程序会将文件中的数据读取。由于在写入文件时是按三种对象写的,所以在读取的时候也要一一对应,这样就可以将文件中的数据准确无误的读入内存,以备使用。用户输入的信息是字符串,并且窗口显示出的信息也同样是字符串,所以就要给HashMap和ArrayList用上泛型,也就是HaShMaPVStringXString>和ArrayList<String>,这样就可以避免在添加信息或是在类型转换的时候发生错误。2.4各功能的设计思路描述2.4.1显小全部功能显示全部功能就是将所有文件中的学生信息一次性展示出来。因为实在文件中的数据,所以要先要有对文件进行读取的动作,之后将所读取出的信息的字符串显示在文本域中。如果在文件中没有任何人物信息,则需要在文本域中显示相应提示,告知用户这个通讯录为空。2.4.2修改功能修改功能的实质就是将就有的信息替换为新的信息,就是字符串内容的替换。首先,要读取文件数据,然后找到用户所想要改的人物信息,并将其显示在文本域中,然后用户根据自己的需求进行修改,如果没有此人,测显示查无此人。在修改结束后,将旧有的信息删除,将修改好的信息重新写入文件。2.4.3添加功能添加功能是所有功能的基础,全都靠它来规范数据。首先,添加功能要在窗口中依次显示姓名、性别、关系、电话、手机、地址、邮编、E-mail这几项信息栏供用户来添加。并且当用户没有添加人名或关系时要有所提示。而性别和关系是指定的几项,来供用户进行选择。而对于E-mail的地址,邮箱类型时也会给用户进行选择,也可让用户自行填写。当用户完成添加之后,可以及时保存到文件中,并且会提示用户是否还要继续添加,是则返回删除界面,否则返回主界面。2 .4.4删除功能删除功能能在文件中消除用户指定的人物的信息。在删除界面,要提供给用户一个填写名字的文本域,然后程序根据所填写人名在文件中进行搜索,并将其删除。如果在文件中没有找到此人名,将会弹出一个新窗口提示用户没有此人。当删除结束后,将会提示用户是否要继续删除,是则返回删除界面,否则返回主界面。3 .4.5查找功能查找功能是将用户想要的信息显示出来。查找功能分为按姓名查找和安关系查找方式。按姓名查找是用户输入一个人名,然后程序在文件中搜索,然后在文本域中显示相关信息。如果没有此人,则要提示用户查无此人。按关系查找是给用户三个选择项,分别是“同学”、“室友”、“老乡”。用户可以选一个或是多个关系,当用户选择完毕确定后,将在文本域中显示此关系下的所有人物信息。2. 4.6排序功能排序功能是将信息按指定顺序依次列出。在本程序中是按姓名的汉语拼音从a到Z依次显示。先将所有姓名按照此顺序排好,然后再依次输出对应名字的信息。第3章程序功能的实现2.1 主界面的实现主界面有六个按钮,分别是显示全部、修改、添加、删除、查找、排序。中间是欢迎使用字样,为每个按钮添加监听器。当运行时,调用主方法就会出现主界面。主界面的主要代码如下:Filef=newFiIe("D:/MailLiSt.dat");publicMainFrmOMainf=newJFrame(学生通讯录);主窗口界面,在标题栏写有学生通讯录”字样对界面布局JPanelNjp=newJPanel();JPanelSjp=newJPaneK);分别在北区和南区添加JPancl组件以便于布置按钮Fontfo=newFont("黑体”,5,50);JLabeljl=newJLabeI(欢迎使用,JLabcLCENTER);设置字体,在JLabel组件中心显示jl.setFont(fo);AlIbtn=newJButton("显示全部”);changebtn=newJBUttOn("修改”);addbtn=newJButton("添加”);dclbtn=newJButton("删除”);Serbtn=newJButton("查找”);SOrbtn=newJButton("排序");创建六个功能按钮Containerc=Mainf.getContentPane();BorderLayoutbl=newBorderLayOUt();将主界面设为BOrderLayOUt布局Mainf.SetLayout(bl);Mainf.SetBounds(700,300,400,300);设置主界面出现位置和大小Njp.add(changcbtn);Njp.add(Allbtn);Njp.add(addbtn);Sjp.add(delbtn);Sjp.add(scrbtn);Sjp.add(sorbtn);c.add(Njp,blNORTH);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);ClclbtnMonitordelm=newdelbtnMonitor(Mainf,f);dclbtn.addActionListener(delm);SerbtnMonitorserm=newSerbtnMonitor(Mainf,f);serbtn.addActionListener(serm);SorbtnMonitorsorm=newSorbtnMonitor(Mainf,f);sorbtn.addActionListener(sorm);添加点击监听器Mainf.SetDefaultcioscOperation(Mainf.EXITONCLOSE);Mainf.setVisible(true);)publicstaticvoidmain(Stringargs)newMainFrm();主方法,用于显示主界面)3. 2主要功能模块的实现3. 2.1显示全部的实现首先要构建一个子窗口,然后指定文件和主窗口。在显示全部界面中,添加一个文本域用于显示全部信息,最下方有一个返回键用于返回主界面。显示全部的主要代码如下:publicAllbtnMonitor(JFramejf,Eilef)用于指定此窗口的母窗口和使用文件this.jf=jf;this,f=f;)publicvoidactiOnPerformed(ActionEvente)try(FileInputStreamfi=newFilelnputStream(f);ObjectlnputStreamoi=newObjectInputStream(fi);HashMap<String,String>name-newHashMap<String,StringX);name=(HaShMaPString,String>)oi.readbjectO;ArrayList<String>al=newrrayList<String>O;al=(ArrayList<String>)oi.readbjectO;Strings=(String)oi.readbjectO;fi.closeO;oi.close();读取文件中的信息ja.SetTeXt(s);将所有信息在文本域中显示ja.setEditable(false);设置为不可写catch(ClassNotFoundExceptionel)catch(IOExceptionel)ja.SetTeXt(此通讯簿为空);V如果没有数据就要提醒用户)js.SetverticaiscrollBarPolicy(js.VERTICAkSCROLLBAR_AS_NEEDED);js.SetHorizontaiscrollBarPolicy(js.HORIZONTAL_SCROLLBAR_AS_NEEDED);设置文本域有横纵滚动条,在需要的时候出现JButtonreb=newJButton("返回”);c.add(jp,BorderLayout.CENTER);c.add(reb,BordcrLayout.SOUTH);将文本域放在中间,返回按钮放在南区AllreMonitorrem=newAllrcMonitorO;reb.addActionLiStcner(rem);返回按钮加上监听器jf.setVisible(false);此界面下,主界面隐藏Alljd.SetVisible(true);)设置返回按钮动作,按下后此界面关闭,主界面出现classAllrcMonitorimplementsActionListenerfpublicvoidactionPerformed(ActionEvente)jf.setVisible(true);Alljd.dispose();)3. 2.2修改的实现当用户输入指定名字时,程序对文件内容进行搜索,让后在文本域中显示相应信息,用户自行改写,当该写好后,点击按钮保存,然后会跳出有一个对话框询问用户是否继续修改。修改的主要代码如下:构造方法与第一个功能一样publicvoidactionPerformed(ctionEvente)GridLayoutcjgl=newGridLayout(2,1);changejd.SetLayoUt(CjgD;设置此界面的布局为两行一列的GridLayout布局FlowLayoutYjfl=newFlowLayout0;Y jp.SetLayOUt(Yjf1);设置填写人名一栏的布局为流式布局BorderLayoutMebl=newBorderLayout0;Mejp.SetLayout(Mebl);设置信息栏及返回键的布局为BorderLayoutJLabelNajl=newJLabe1("请输入”);Najt=newJTextFieldO;Yjb=newJBUItOn("确定”);Y MonitorYm-newYMonitorO;Y jb.addctionListener(Ym);JLabelcgjl=newJLabe1("请修改");Meja=newJTextAreaO;js.SetHorizontaiscrollBarPolicy(js.HORIZONTALSCROLLBAR_AS_NEEDED);设置文本域中的滚动条Mejp.add(cgjl,Mebl.NORTH);Mejp.add(js,Mebl.CENTER);Ycjb=newJBUtton("确定更改");Y cMonitorYcm=newYcMonitorO;Y cjb.addActionListener(Ycm);Cjb3=newJBUttOn(取消”);CMonitorCm=newCMonitorO;Cjb3.addActionListener(Cm);Y Cjp=newJPanel();FlowLayoutYCfl=newFlowLayout(FlowLayout.CENTER);将最下方两个按键一栏设为流式布局Y Cjp.SetLayout(YCfl);MejP.add(YCjp,McbLSOUTH);将提示新信息放北区,文本域放在中间,取消按钮放在南区jf.SetVisible(false);此界面下,主界面隐藏changejd.setVisible(true);)设置确定姓名按钮动作,当按下此按钮后,程序会根据相应的姓名键,去找它在HaShMaP中所对应的值并供用户修改classYMonitorimplementsActionListenertpublicvoidactionPerformcd(ActionEvente)try(读取文件数据FileInputStreamfi=newFiIeInputStream(f);ObjectInputStreamoi=newObjectInputStream(fi);namc=newHashMap<String,String>();name=(HashMapCString,String>)oi.readbject();al=newArrayList<String>();al=(ArrayList<String>)oi.readbject();s=(String)oi.readbject();fi.close();oi.close();oname=Najt.getText().trim();记录初始名字if(onamc=null)(如果没有填写名字将会提示用户输入Mcja.SetTeXt("请先输入姓名");elseif(s.indexf(Najt.gctText().trim()=l)(如果找不到此姓名,则会告知用户此人不存在Najt.SetText("");Mcja.SetTeXt("查无此人”);Mcja.SetEditable(false);else找到此姓名,将此姓名对应的信息显示在文本域中,并初始输入名栏Meja.setText(name,get(Najt.getText().trim();Meja.SetEditable(true);Najt.setText;)catch(ClassNotFoundExceptionel)catch(IOExceptionel)如果通讯录为空则会给用户提示Najt.setText;Meja.SetTeXt("此通讯簿为空”);)设置确定更改按钮动作,按下后就有的信息将会清除,而会加上修改后的信息classYcMonitorimplementsActionListener(JDialogcsjd;publicvoidactionPerformcd(ActionEvente)Stringnname=null;Stringmg=Meja.getText();循环结构,来防止重名人物信息不能有效更改,将每一个姓名中的每一条信息分开,单独操作for(;mg.indcxf("姓名:")!=T;)判断是否还有另一条信息intnbp=O;截取信息开始的位置intnep=O;for(;mg.charAt(nep)!=,E*;)nep=nep+l;)for(intnepp=nep;mg.charAt(nepp+6)!=>n*;nepp+)nep=nepp+6;)获得截取信息结束前倒数第二个位置Stringnmstr=mg.substring(nbp,ncp+2);获得截取信息inti=nmstr.indexf(oname);intj=nmstr.indexf("姓名:");判断姓名是否更改if(i=-l)intk=0;for(;nmstr.charAt(k)!=,n,;)k=k+l;)nname=nmstr.substring(j+3,k).trim();如果名字更改,获取新名字)elsenname=onamc;沿用初始名字)Stringc=name.get(“同学”);StringCr=name,get("同学、室友”);Stringcl=namc.get("同学、老乡”);StringCrI=name,get("同学、室友、老乡”);Stringr=name.get("室友”);Stringrl=namc.get("室友、老乡”);Stringl=name.get("老乡”);保存截取信息修改前的信息intobp;intoep;for(obp=0;name,get(oname).charAt(obp)!='姓';)obp=obp+l;)for(oep=l;name,get(oname).charAt(ocp)!=E')oep=oep+l;)for(intoepp=ocp;name,get(oname).charAt(oepp+6)!=n'OePP+)oep=oepp+6;)Stringomstr=name.get(oname).substring(obp,oep+2);intoc=namc.get(oname).indcxf("同学”);intor=name.get(oname).indexf("室友”);intol=namc.get(oname).indcxf("老乡");判断修改前信息包含哪几种关系intnt=nmstr.indcxf("同学");intnr=nmstr.indcxf("室友”);intnl=nmstr.indcxf("老乡");判断修改后信息包含哪几种关系将各关系中包含有此旧信息的数据清除if(oc!=-l)if(or!=-l)if(ol!=-l)name.put(/z同学、室友、老乡”,crl.replaccAll(*nr*+omstr,"");crl=crl.replaceAll(“nr"+omstr,"");name,put(“同学”,c.replaceAll(“nr"+omstr,"");c=c.replaceAll(“nr"+omstr,"");name,put(“室友”,r.replaceAll(“nr"+omstr,"");r=r.replaceAll(“nr"+omstr,“);name,put("老乡",1.replaceAll(“nr"+omstr,);1=1.replaceAll(“nr"+omstr,"");name,put(“同学、室友”,cr.replaceAll(*nr*+omstr,);cr=cr.replaceAll(“nr"+omstr,"");name,put(“室友、老乡”,rl.replaceAll(*nr*+omstr,");rl=rl.replaceAll(“nr"+omstr,"");name,put("同学、老乡",CLrePlaCeAII.("nr"+omstr,);cl=cl.replaceAll(“nr"+omstr,"");)elsename,put("同学、室友”,cr.replaceAll(*nr*+omstr,");cr=cr.replaceAll(“nr"+omstr,;name,put(“同学”,c.replaceAll(“nr"+omstr,c=c.replaceAll(“nr"+omstr,"");name,put(“室友”,r.replaceAll("nr"+omstr,"");r=r.replaceAll(“nr"+omstr,“);)elseif(ol!=-l)name,put(同学”,c.replaceAll(“nr"+omstr,"");c=c.replaceAll(“nr"+omstr,"");name,put("老乡",LrePIaCeAlI(“nr"+omstr,"");1=1.replaceAll(*nrz,+omstr,;name,put(“同学、老乡”,cl.replaceAll("nr"+omstr,"");cl=cl.replaceAll(“nr"+omstr,"");)elsename.PUt(“同学”,c.replaceAll(“nr"+omstr,"");c=c.replaceAll(“nr"+omstr,"");)elseif(or!=-1)if(ol!=-l)(name,put(室友”,r.replaceAll(“nr"+omstr,);r=r.replaceAll(“nr"+omstr,"");name,put("老乡",LrePIaCeAlI(“nr"+omstr,"");1=1.replaceAll(*nrz,+omstr,;name,put(“室友、老乡”,rl.replaceAll(*nr*+omstr,*);rl=rl.replaceAll(“nr"+omstr,"");)elsename,put("室友”,r.replaceAll(“nr"+omstr,);r=r.replaceAll(“nr"+omstr,"");)elseif(ol!=-l)name,put("老乡",1.replaceAll(yznrz,+omstr,"");1=1.replaceAll(“nr"+omstr,;)将旧信息在各数据中彻底清除Stringnna=name.get(oname).replaceAll(omstrf"");name,put(oname,nna);al.remove(onamc);mg=mg.replaceAll(nmstr,"");将新信息添加在新信息所包含的各关系中if(nt!=-l)if(nr!=-l)if(nl!=-l)name.PUt(“同学",c+"nr"+nmstr);name.PUt(“室友",r+"nr"+nmstr);name.PUt("老乡",l+"nr"+nmstr);name,put(“同学、室友“,cr+"nr"+nmstr);name,put("同学、室友、老乡”,CrI+“nr"+nmstr);name,put("同学、老乡",cl+*nr*+nmstr);name,put(“室友、老乡”,rl+*nr*+nmstr);elsename.PUt(“同学",c+"nr"+nmstr);name.PUt("室友",r+"nr"+nmstr);name,put("同学、室友“,cr+"nr"+nmstr);)elseif(nl!=-l)name.PUt(“同学",c+"nr"+nmstr);name,put("老乡",l+"nr"+nmstr);name,put("同学、老乡",cl+"nr"+nmstr);)elsename.PUt(“同学",c+"nr"+nmstr);)elseif(nr!=-l)if(nl!=-l)name.PUt(室友“,r+"nr"+nmstr);name,put("老乡",l+"nr"+nmstr);name,put(“室友、老乡",rl+"nr"+nmstr);)elsename.PUt(室友“,r+"nr"+nmstr);)elseif(nl!=-l)name.PUt("老乡",l+"nr"+nmstr);)将新信息添加在个数据中Stringstrnm=name.get(nname);name,put(nname,strnm+nmstr);al.add(nname);将更新数据写入文件ObjectOutputStreamoo=newObjectOutputStreani(newFiIeOutputStream(f);oo.WriteObject(name);oo.WriteObject(al);s=s.replaccAll(omstr,nmstr);oo.WriteObject(s);oo.close();)catch(IOExceptione2)创建对话框,提示修改成功,询问用户是否继续修改JLabelcsjl=ncwJLabcl("更改成功!是否继续更改?”,JLabeLCENTER);JButtoncsYjb=newJBUttOn("是");ChangebtnMonitorcsYrm=newChangebtnMonitor(jf,f);csYjb.addActionListener(csYrm);CsYMonitorcsYm=newCsYMonitor();csYjb.addActionListener(csYm);添加两个监听器用来完成关闭和重新打开更改界面动作JButtonNjb=newJButton("否");NMonitorNm=newNMonitor();Njb.addActionListener(Nm);changejd.dispose();csjd.SetVisible(true);)classCsYMonitorimplementsActionListcnerpublicvoidactionPerformed(ActionEvente)csjd.dispose();)classNMonitorimplementsActionListenerpublicvoidactionPerformed(ActionEvente)csjd.dispose();jf.setVisible(true);)classCMonitorimplementsActionListenerpublicvoidactionPerformed(ActionEvente)changejd.dispose();jf.setVisible(true);)3.2.3添加的实现在此界面中,给用户提供多个填写栏和选择钮,用以完善信息。而对于重名的信息来说,字符串直接连接信息,不会受到影响,而当在HaShMaP中,为了不掩盖原有的值,则采用与关系键值添加的方法,在值后面在连接上信息的信息。添加的主要代码如下:构造方法与第一个功能一样publicvoidactionPerformed(ctionEvente)addjcl=newJDialog(jf);GridLayoutadgl=newGridLayOUt(9,1,0,5);将此界面划分为九行一列添加个信息填写栏和选择项JLabelNajl=newJLabel("姓名:);Najt=newJTextFieldO;创建男女单选项JLabelSXjI=newJLabel("性别:");Majr=newJRadioButton("男");MjMonitorMjm=newMjMonitorO;Majr.addActionListener(Mjm);FCjr=n。WJRadiOBUttOn("女");FjMonitorFjm=newFjMonitorO;Fejr.addActionListener(Fjm);ButtonGroupbg=newBUttOnGrOUP();将男女选择按钮放在一组形成单选,选择一个,另一个就为空bg.add(Majr);bg.add(Fejr);JLabCIRejI=newJLabcl("关系:”);创建关系多选框,可以选择多种关系cjc=newJCheCkBOx("同学”);rjc=newJChCCkBOx("室友”);IJC=newJCheckBox("老乡”);JLabelTPjl=newJLabel("电话:”);Tpjt=newJTextFieldO;JLabelPhjl=newJLabel("手机:);Phjt=newJTextFieldO;JLabelAdjl=newJLabel(“地址:”);Adjt=newJTextFieldO;JLabelPsjl=newJLabe1("邮编:);Psjt=newJTextFieldO;JLabelEmjl=newJLabel(z,E-mail:");Emjt=newJTextFieldO;Stringstr=*","qq.Com","163.Com”,"126.COnr,"*);创建邮箱种类下拉菜单供用户选择Emjcb=newJComboBox<0bject>(str);JButtonsajb=ncwJBUttor1("保存");SaMonitorsam=newSaMonitor();sajb.addActionListener(sam);JButtonCajb=newJButton("取消");CaMonitorcam=newCaMonitor();cajb.addActionListener(cam);判断选了哪几种关系classSaMonitorimplementsActionListener(publicvoidactiOnPerformcd(ActionEvente)if(cjc.isSelected()if(rjc.isSelected()ljc.isSelected()stcc=cjc.getText()+“、”;)elsestcc=cjc.getText();)elseStcc=*;)if(rjc.isSelected()if(1jc.isSelected()StCr=rjc.getText()+“、”;)elsestcr=rjc.getText();)elsestcr=*;)if(1jc.isSelected()stc