投票管理系统.docx
- 文档编号:5085917
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:16
- 大小:50.48KB
投票管理系统.docx
《投票管理系统.docx》由会员分享,可在线阅读,更多相关《投票管理系统.docx(16页珍藏版)》请在冰豆网上搜索。
投票管理系统
中文摘要
本文主要是研究如何开发一个“简单、实用”的基于Applet的投票管理系统。
本系统运用到了窗口布局、按钮事件的触发和字符串分析器等相关知识,界面简洁、清爽,操作简单,用户可以自定义候选人,允许用户修改候选人,支持多次投票,能够自动统计出一共投的票数、废票数、弃权票数和各个候选人的得票数。
除此之外,本系统还支持排序功能,为用户自动按得票数从高到低进行排序。
在此基础上,本系统增加了一些实用的功能,背景音乐给人以轻松愉快的操作心情,使用说明功能使用户容易上手,还有一个保存结果功能使用户方便保存投票统计结果。
目 录
一、课程设计任务及要求
设计一个投票管理系统界面,要求输入候选人名单后,点击确认按钮实现使用选择框代表候选人,计选择框的名字就是候选人的名字。
点击取消按钮候选人输入框为空,重新输入候选人名单。
选中候选人的选择框时,表示给该候选人投一票。
点击确定按钮时表示产生一张选票。
点击刷新按钮回到程序的初始界面重新设置候选人。
根据选择框的状态变化统计出候选人的最后得票数,并可按票选取多少点击排序按钮对候选人进行排序。
(其中,最多从候选人中选取3人,如果一张选票选取多于3人,该票就作废票处理。
如果一个也没投票,就作弃权处理。
程序能显示一共统计了多少选票,并能统计出废票和弃权票的票数。
图1-1操作界面
二、需求分析
这个投票管理系统的主要功能是:
设置候选人,对候选人进行投票,统计出结果,并能够对结果按选票数由高到低进行排序,有背景音乐和使用帮助,最后还能保存统计结果。
主要功能的用例描述如下:
1.运行投票管理系统,此时背景音乐会响起。
2.点击“使用说明”来查看使用方法。
3.在候选人文本框中输入不超过10个候选人,候选人之间用空格隔开,点击确认以完成候选人的设置,点击旁边的取消可以从新设置候选人。
4.在生成的候选人选框中选择想要选的候选人,点击下面的“确定”按钮以完成选票的填制,此时在显示统计结果的地方能即时的看到选票统计结果。
5.重复第4步来填制下一张选票。
6.点击“排序”按钮后统计结果会按照候选人的票数从高到低进行排列。
7.点击“保存结果”会弹出一个文本域对话框,里面有刚刚统计的结果,ctrl+a全部选中,再ctrl+c复制,这样就可以将结果粘贴到别处保存下来。
8.点击“刷新”后回到主界面,重新设置候选人,进行下一轮投票。
三、设计思路
先制作主界面,然后再实现各个按钮的功能。
本程序主要需要掌握窗口的布局和按钮事件的触发相关知识,所有部件都可以添加到面板Panel上,显示提示信息需要用到标签Label,输入框需要新建TextField,按钮用Button,选票需要新建Checkbox复选框来实现,至于下面那个用来显示各个候选人得票数的要先新建文本框TextField添加到一个小面板上,再新建个Scroll滚动条,将建有文本框的面板添加到Scroll滚动条上就可以了。
为了做出这个界面还需要对各个部件进行摆放,为了达到那个效果,可以将整个界面分成很多个小块,每一小块都是个面板,最后再拼接起来,每个小块都设置好布局setLayout,在这里主要用到网格布局GridLayout,流式布局FlowLayout和BorderLayout方位布局,设置面板的颜色可以用setBackground()来实现。
做好界面后,接下来就需要去实现各个功能了。
因为各个功能都是通过按钮来实现的,所以要对按钮进行注册监听addActionlistener(),监听之后就是对按钮事件的处理了actionPerformed(ActionEvente)。
要一个字符串中的人名,可以用StringTokenizer字符串分析器来获取候选人的名字,其中还要用到里面的一些方法,比如nextToken()、hasMoreTokens()、countTokens()。
还有setEnabled()方法可以设置按钮是否可用,setState(boolean)可以设置复选框是否激活,在文本框或文本域中输出和获取信息可以分别用setText()和getText(),根据候选人数将多余的复选框去掉,可以让设置多余的为不可见setVilible(flase)这样就行了。
对于附加功能如背景音乐,可以用AudioClip接口、publicvoidplay()控制播放、publicvoidloop()实现循环播放、publicvoidstop()停止播放当前音乐、使用说明和保存结果都是需要通过新建Franme窗体实现的。
四、详细设计
图4-1流程图
界面设计时,先定义好各个部件:
标签Label、文本框TextFiled、按钮Button、复选框Checkbox、Scroll滚动条,我把整个界面分成很多个小面板,每一行部件都在一个小面板上面,最后将这些小面板一个个添加上去add(),像流式布局FlowLayout、方位布局BorderLayout、网格布局GridLayout主要是用到了这三种布局,中间那几块面板通过setBackground()将其背景色改为绿色。
经过不断修改测试运行,一个投票系统的主界面就做出来了。
setLayout(newBorderLayout());
pa.setLayout(newGridLayout(7,1));
pb.setLayout(newBorderLayout());
p4.setLayout(newGridLayout(1,5));
p5.setLayout(newGridLayout(1,5));
p1.add(hint);p2.add(canditate);p2.add(help);
p3.add(confirm1);p3.add(cancle);p3.add(notice);
p4.setBackground(Color.green);
p5.setBackground(Color.green);
p6.setBackground(Color.green);
for(inti=0;i<5;i++){//创建候选人选项
candidate[i]=newCheckbox(candidatelist[i]);
p4.add(candidate[i]);
}
for(inti=5;i<10;i++){//创建候选人选项
candidate[i]=newCheckbox(candidatelist[i]);
p5.add(candidate[i]);
}
for(intj=0;j<10;j++){
candidate[j].setEnabled(false);
}
p6.add(confirm2);p6.add(refresh);p6.add(sort);
p7.add(result);p7.add(out);p7.add(save);
pa.add(p1);pa.add(p2);pa.add(p3);pa.add(p4);pa.add(p5);pa.add(p6);pa.add(p7);
p.setLayout(newGridLayout(10,1));
for(inti=0;i<10;i++){
p.add(personvote[i]);
}
ScrollPanescroll=newScrollPane();
scroll.add(p);
pc.add(banquan);
pb.add("Center",scroll);
pb.add("South",pc);
add("Center",pa);
add("South",pb);
接下来就是对各个功能的实现了,定义几个类变量来记录投票相关记录如:
Checkboxcandidate[]//选择框数组,代表候选人
TextFieldpersonvote[]//文本条数组,显示每个人的得票情况
intcount[]//记录每个人的得票数
inttotalvote=0,//总票数
intpeoplenumber=0;//候选人个数
intcount1=0,invalidatedTicket=0,abstention=0;//分别表示选的人数,废票数,弃权票数
对各个按钮进行注册监听addActionListener()
在输入候选人名单时是输入一串名字,所以要从这一串名字中单个的提取出来并统计出候选人个数,在完成这项功能时要用到StringTokenizer类。
Stringg=canditate.getText();//获取输入的候选人
StringTokenizerst=newStringTokenizer(g);//字符串分析器
peoplenumble=st.countTokens();//统计候选人数
inti=0;
while(st.hasMoreTokens()){
candidatelist[i]=st.nextToken();
i++;}//获取语言符号(候选人名单)
点击确认按钮后,根据候选人个数添加单选按钮,并以候选人名字作为单选按钮的标签名。
for(intj=0;j<10;j++)candidate[j].setLabel(candidatelist[j]);
//将候选人名单添加到复选框里
将多余的选框设置为不可见
for(intj=peoplenumble;j<10;j++)
candidate[j].setVisible(false)
点击“取消”的话输入候选人的文本框为空,此时可以重新输入,点击下面“确定”则统计选了多少人并通过这个判断是废票还是弃权,然后分别给候选人增加票数并输出相应的信息;
for(intj=0;j<10;j++){
if(candidate[j].getState())
count1++;}//统计选了多少人
if(count1==0)abstention++;//一个都没选则选票作为弃权
if(count1>3)invalidatedTicket++;//选的人数超过3个则选票作废
if(count1<=3&&count1>0){
for(intj=0;j if(candidate[j].getState()) count[j]++;}//统计候选人所得票数 out.setText("已经统计了: "+totalvote+"张选票,其中弃权票: "+abstention+"作废票: "+invalidatedTicket);//输出统计结果 for(intj=0;j personvote[j].setText(""+candidatelist[j]+"得票数: "+count[j]);//输出各个候选人得票数 点击“排序”则比较各个候选人的票数由高到低进行排序 for(intj=0;j for(inti=j+1;i if(count[j] m=count[j];count[j]=count[i];count[i]=m; n=candidatelist[j];candidatelist[j]=candidatelist[i];candidatelist[i]=n; }//按得票数由多到少进行排序 “刷新”按钮通过清空所有文本框中的数据,所有变量变为初始化值; “使用说明”通过弹出Frame窗体来实现,在该窗体中新建了几个文本框TextFeild和Scroll滚轮用来显示帮助信息。 “保存结果”也是通过弹出Franme窗体,窗体里面有个文本域TextArea,用来输出统计的结果,在文本域中,用户可以复制里面的内容然后保存在其他文件中 classSaveextendsFrame{//“保存结果”的弹出窗体 TextAreasave; Save(){ super("统计结果"); save=newTextArea(11,1); add(save); save.setText(out.getText()+'\n'+personvote[0].getText()+'\n'+personvote[1].getText()+'\n'+ personvote[2].getText()+'\n'+personvote[3].getText()+'\n' +personvote[4].getText()+'\n'+personvote[5].getText()+'\n' +personvote[6].getText()+'\n'+personvote[7].getText()+'\n' +personvote[8].getText()+'\n'+personvote[9].getText()+'\n'); setSize(300,300); setVisible(true); addWindowListener(newcloseWin()); } classcloseWinextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ Windoww=e.getWindow(); w.dispose(); } } }。 最后说下背景音乐的实现,通过添加AudioClip接口来实现 AudioClipmusic;//播放音乐 music=getAudioClip(getCodeBase(),"瘦瘦的-梁静茹.mid"); publicvoidstart(){//循环播放音乐 music.loop();} publicvoidstop(){//结束播放 music.stop();} 五、运行调试与分析讨论 运行本投票管理系统后,会出现主界面,此时音乐响起,首先点击使用说明以了解如何使用本系统。 在候选人输入框中输入候选人,点击下面的“确认”按钮以完成候选人的设置,设置完候选人后,候选人的名字会出现在下面的选框中,此时可以进行投票。 在候选人前点下会出现“√”此时表示选中该候选人,然后点击下面的“确定”按钮以确认选票,此时要注意,选票一旦确定将无法更改,在此环节可以进行多次填制选票,投票结果将会自动显示出来。 点击下面“排序”可以对候选人所得票数从高到低进行排序。 投票结束后,点击旁边“保存结果”会弹出一个窗口,里面有刚刚投票的结果,可以将它们复制粘贴到别的地方以方便保存。 在本系统中有些功能还待完善,用户一旦确认选票后将无法更改,应该添加一个修改选票的功能,而保存结果这个功能,如果可以直接以对话框的形式保存在文件中就省去了用户复制粘贴这个步骤。 图5-1运行后的主界面(背景音乐响起)部分按钮已禁用 图5-2点击“使用说明”后弹出的帮助文档 图5-3输入候选人点击“确认”后,候选人出现在选票上 图5-4选择候选人,点击“确定”后自动统计出结果,并清空上一次选框中的勾 图5-5点击“排序”后,候选人根据票数由高到低排列 图5-6点击“保存结果”弹出一个统计结果的窗体可以对其进行复制,方便保存 图5-7点击“刷新”所有数据清空回到主界面,此时可以进行下一轮投票 七、参考文献 [1]丁振凡.Java语言实用教程(第1版)[M].北京: 北京邮电大学出版社,2005.2 [2]丁振凡.Java语言实用教程(第2版)[M].北京邮电大学出版社.2008.1 [3]丁振凡.Java语言实用教程实验指导(第2版)[M].北京邮电大学出版社.2008.1 [4]杨树林等.Java语言最新实用案例教程(第2版)[M].清华大学出版社.2010.7 八、附录 源代码: importjava.io.*; importjava.awt.*; importjava.util.*; importjava.applet.*; importjavax.swing.*; publicclass投票管理系统extendsAppletimplementsActionListener{ AudioClipmusic;//播放音乐 Labelhint,result,notice,banquan; TextFieldcanditate;//输入候选人文本框 TextFieldout;//显示选举结果的文本框 Buttonconfirm1,cancle,confirm2,refresh,sort;//分别表示确认、取消、确定、刷新、排序 Buttonhelp;//使用说明 Buttonsave;//保存统计结果 Checkboxcandidate[]=newCheckbox[10];//选择框数组,代表候选人 TextFieldt1,t2,t3,t4,t5,t6,t7,t8,t9,t10; TextFieldpersonvote[]={t1,t2,t3,t4,t5,t6,t7,t8,t9,t10};//文本条数组,显示每个人的得票情况 Stringcandidatelist[]=newString[10];//候选人名单 intcount[]={0,0,0,0,0,0,0,0,0,0};//记录每个人的得票数 inttotalvote=0;//总票数 intpeoplenumble=0;//候选人个数 intcount1=0,invalidatedTicket=0,abstention=0;//分别表示选的人数,废票数,弃权票数 publicvoidinit(){ music=getAudioClip(getCodeBase(),"瘦瘦的-梁静茹.mid"); hint=newLabel("首先输入候选人的名字(人数不超过10,名字之间用空格分隔): "); notice=newLabel("用下面的选择框统计选票(最多选3人): "); result=newLabel("选举结果: "); banquan=newLabel("版权所属: 09软件工程+会计学2班祝捷"); canditate=newTextField(50); confirm1=newButton("确认");cancle=newButton("取消");confirm2=newButton("确定");refresh=newButton("刷新");sort=newButton("排序"); confirm2.setEnabled(false);refresh.setEnabled(false);sort.setEnabled(false); help=newButton("使用说明");save=newButton("保存结果");save.setEnabled(false); out=newTextField(50); for(inti=0;i<10;i++) personvote[i]=newTextField(80); Panelp=newPanel(); Panelp1=newPanel(); Panelp2=newPanel(); Panelp3=newPanel(); Panelp4=newPanel(); Panelp5=newPanel(); Panelp6=newPanel(); Panelp7=newPanel(); Panelpa=newPanel(); Panelpb=newPanel(); Panelpc=newPanel(); setLayout(newBorderLayout()); pa.setLayout(newGridLayout(7,1)); pb.setLayout(newBorderLayout()); p4.setLayout(newGridLayout(1,5)); p5.setLayout(newGridLayout(1,5)); p1.add(hint);p2.add(canditate);p2.add(help); p3.add(confirm1);p3.add(cancle);p3.add(notice); p4.setBackground(Color.green); p5.setBackground(Color.green); p6.setBackground(Color.green); for(inti=0;i<5;i++){//创建候选人选项 candidate[i]=newCheckbox(candidatelist[i]); p4.add(candidate[i]); } for(inti=5;i<10;i++){//创建候选人选项 candidate[i]=newCheckbox(candidatelist[i]); p5.add(candidate[i]); } for(intj=0;j<10;j++){ candidate[j].setEnabled(false); } p6.add(confirm2);p6.add(refresh);p6.add(sort); p7.add(result);p7.add(out);p7.add(save); pa.add(p1);pa.add(p2);pa.add(p3);pa.add(p4);pa.add(p5);pa.add(p6);pa.add(p7); p.setLayout(newGridLayout(10,1)); for(inti=0;i<10;i++){ p.add(personvote[i]); } ScrollPanescroll=newScrollPane(); scroll.add(p); pc.add(banquan); pb.add("Center",scroll); pb.add("South",pc); add("Center",pa); add("South",pb); confirm1.addActionListener(this); cancle.addActionListener(this); confirm2.addActionListener(this); refresh.addActionListener(this); sort.addActionListener(this); help.addActionListener(this); save.addActionListener(this); }//面板的布局 publicvoidstart(){//循环播
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 投票 管理 系统