【课程设计报告】基于JAVA GUI的投票管理系统的设计与实现.doc
课程设计(论文)任务书 软 件 学 院 学院 09软件工程+会计学 专业 2 班 一、课程设计(论文)题目 简单投票管理系统(小应用程序Applet) 二、课程设计(论文)工作自 2010 年 12 月 20 日起至 2010 年 12 月 24 日止。三、课程设计(论文) 地点: 软 件 学 院 实 训 中 心 四、课程设计(论文)内容要求:1本课程设计的目的(1)掌握Java语言的程序设计方法; (2)理论联系实际,进一步提高学生的软件开发技术;(3)培养学生分析、解决问题的能力;(4)提高学生实践论文撰写能力。2课程设计的任务及要求1)课程设计任务:设计一个投票管理系统。2)创新要求:(1)新增背景音乐(2)新增程序的“使用说明”(3)在输入候选人之前选项框和部分功能键被禁用,防止乱点导致统计结果有误(4)新增保存结果功能(5)新增版权所属标签3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路-工作原理、功能规划(3)详细设计-数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7)报告按规定排版打印,要求装订平整,否则要求返工;(8)课设报告的装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。4)课程设计评分标准: (1)学习态度:10分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:30分。5)参考文献:(1)丁振凡. Java语言实用教程(第2版)M. 北京邮电大学出版社. 2008.1 (2)丁振凡. Java语言实用教程实验指导(第2版)M. 北京邮电大学出版社. 2008.1(3)杨树林等. Java语言最新实用案例教程(第2版)M. 清华大学出版社. 2010.76)课程设计进度安排1准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2程序模块设计分析阶段(4学时):程序总体设计、详细设计3代码编写调试阶段(8学时):程序模块代码编写、调试、测试4撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名: 2010 年 12 月 20 日课程设计(论文)评审意见(1)学习态度(10分):优()、良()、中()、一般()、差(); (2)系统设计(20分):优( )、良()、中()、一般()、差(); (3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)论文撰写(30分):优()、良()、中()、一般()、差(); 评阅人: 职称: 讲师 2010 年 12 月 25 日目录一、课程设计任务及要求1二、需求分析2三、设计思路3四、详细设计6五、运行调试与分析讨论15六、设计体会与小结19七、参考文献20一、课程设计任务及要求 设计一个如图1所示的投票管理系统界面,要求输入候选人名单后,点击确认按钮实现使用选择框代表候选人,计选择框的名字就是候选人的名字。点击取消按钮候选人输入框为空,重新输入候选人名单。选中候选人的选择框时,表示给该候选人投一票。点击确定按钮时表示产生一张选票。点击刷新按钮回到程序的初始界面重新设置候选人。根据选择框的状态变化统计出候选人的最后得票数,并可按票选取多少点击排序按钮对候选人进行排序。(其中,最多从候选人中选取3人,如果一张选票选取多于3人,该票就作废票处理。如果一个也没投票,就作弃权处理。程序能显示一共统计了多少选票,并能统计出废票和弃权票的票数。 图1 二、需求分析本程序主要需要掌握窗口的布局和按钮事件的触发相关知识,所有部件都可以添加到面板Panel上,显示提示信息需要用到标签Label,输入框需要新建TextField,按钮用Button,选票需要新建Checkbox复选框来实现,至于下面那个用来显示各个候选人得票数的要先新建文本框TextField添加到一个小面板上,再新建个Scroll滚动条,将建有文本框的面板添加到Scroll滚动条上就可以了。为了做出这个界面还需要对各个部件进行摆放,为了达到那个效果,可以将整个界面分成很多个小块,每一小块都是个面板,最后再拼接起来,每个小块都设置好布局setLayout,在这里主要用到网格布局GridLayout,流式布局FlowLayout和BorderLayout方位布局,设置面板的颜色可以用setBackground()来实现。做好界面后,接下来就需要去实现各个功能了。因为各个功能都是通过按钮来实现的,所以要对按钮进行注册监听addActionlistener(),监听之后就是对按钮事件的处理了actionPerformed(ActionEvent e)。要一个字符串中的人名,可以用StringTokenizer字符串分析器来获取候选人的名字,其中还要用到里面的一些方法,比如nextToken()、hasMoreTokens()、countTokens()。还有setEnabled()方法可以设置按钮是否可用,setState(boolean)可以设置复选框是否激活,在文本框或文本域中输出和获取信息可以分别用setText()和getText(),根据候选人数将多余的复选框去掉,可以让设置多余的为不可见setVilible(flase)这样就行了。对于附加功能如背景音乐,可以用AudioClip接口、public void play()控制播放、public void loop()实现循环播放、public void stop()停止播放当前音乐、使用说明和保存结果都是需要通过新建Franme窗体实现的。三、设计思路一拿到这个题目我就构思好了大概的方向,那就是先制作主界面,然后再实现各个按钮的功能。界面设计时,先定义好各个部件:标签Label、文本框TextFiled、按钮Button、复选框Checkbox、Scroll滚动条,我把整个界面分成很多个小面板,每一行部件都在一个小面板上面,最后将这些小面板一个个添加上去add(),像流式布局FlowLayout、方位布局BorderLayout、网格布局GridLayout主要是用到了这三种布局,中间那几块面板通过setBackground()将其背景色改为绿色。经过不断修改测试运行,一个投票系统的主界面就做出来了。接下来就是对各个功能的实现了,定义几个类变量来记录投票相关记录如:Checkbox candidate /选择框数组,代表候选人TextField personvote /文本条数组,显示每个人的得票情况int count /记录每个人的得票数int totalvote=0, /总票数int peoplenumber=0; /候选人个数int count1=0,invalidatedTicket=0,abstention=0; /分别表示选的人数,废票数,弃权票数 对各个按钮进行注册监听addActionListener()在输入候选人名单时是输入一串名字,所以要从这一串名字中单个的提取出来并统计出候选人个数,在完成这项功能时要用到StringTokenizer类。 String g=canditate.getText();/获取输入的候选人StringTokenizer st=new StringTokenizer(g);/字符串分析器peoplenumble=st.countTokens();/统计候选人数int i=0;while(st.hasMoreTokens()candidatelisti=st.nextToken();i+;/获取语言符号(候选人名单)点击确认按钮后,根据候选人个数添加单选按钮,并以候选人名字作为单选按钮的标签名。for(int j=0;j<10;j+) candidatej.setLabel(candidatelistj);/将候选人名单添加到复选框里将多余的选框设置为不可见for(int j=peoplenumble;j<10;j+)candidatej.setVisible(false)点击“取消”的话输入候选人的文本框为空,此时可以重新输入,点击下面“确定”则统计选了多少人并通过这个判断是废票还是弃权,然后分别给候选人增加票数并输出相应的信息; for(int j=0;j<10;j+) if(candidatej.getState() count1+;/统计选了多少人if(count1=0) abstention+;/一个都没选则选票作为弃权if(count1>3) invalidatedTicket+;/选的人数超过3个则选票作废if(count1<=3&&count1>0)for(int j=0;j<peoplenumble;j+)if(candidatej.getState() countj+;/统计候选人所得票数out.setText("已经统计了:"+totalvote+"张选票,其中弃权票:"+abstention+"作废票:"+invalidatedTicket);/输出统计结果 for(int j=0;j<peoplenumble;j+) personvotej.setText(""+candidatelistj+"得票数:"+countj);/输出各个候选人得票数点击“排序”则比较各个候选人的票数由高到低进行排序for(int j=0;j<peoplenumble;j+)for(int i=j+1;i<peoplenumble;i+)if(countj<counti)m=countj;countj=counti;counti=m;n=candidatelistj;candidatelistj=candidatelisti;candidatelisti=n;/按得票数由多到少进行排序“刷新”按钮通过清空所有文本框中的数据,所有变量变为初始化值;“使用说明”通过弹出Frame窗体来实现,在该窗体中新建了几个文本框TextFeild和Scroll滚轮用来显示帮助信息。“保存结果”也是通过弹出Franme窗体,窗体里面有个文本域TextArea,用来输出统计的结果,在文本域中,用户可以复制里面的内容然后保存在其他文件中。最后说下背景音乐的实现,通过添加AudioClip接口来实现AudioClip music;/播放音乐music=getAudioClip(getCodeBase(),"瘦瘦的-梁静茹.mid");public void start()/循环播放音乐music.loop();public void stop()/结束播放music.stop();四、详细设计import java.io.*;import java.awt.*;import java.util.*;import java.applet.*;import java.awt.event.*;import javax.swing.*; public class 投票管理系统 extends Applet implements ActionListenerAudioClip music;/播放音乐Label hint,result,notice,banquan;TextField canditate;/输入候选人文本框TextField out;/显示选举结果的文本框Button confirm1,cancle,confirm2,refresh,sort;/分别表示确认、取消、确定、刷新、排序Button help;/使用说明Button save;/保存统计结果Checkbox candidate=new Checkbox10;/选择框数组,代表候选人TextField t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;TextField personvote=t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;/文本条数组,显示每个人的得票情况String candidatelist=new String10;/候选人名单int count=0,0,0,0,0,0,0,0,0,0;/记录每个人的得票数int totalvote=0;/总票数int peoplenumble=0;/候选人个数int count1=0,invalidatedTicket=0,abstention=0; /分别表示选的人数,废票数,弃权票数public void init()music=getAudioClip(getCodeBase(),"瘦瘦的-梁静茹.mid");hint=new Label("首先输入候选人的名字(人数不超过10,名字之间用空格分隔):");notice=new Label("用下面的选择框统计选票(最多选3人):");result=new Label("选举结果:");banquan=new Label("版权所属:09软件工程+会计学2班 祝捷");canditate=new TextField(50);confirm1=new Button("确认");cancle=new Button("取消");confirm2=new Button("确定");refresh=new Button("刷新");sort=new Button("排序");confirm2.setEnabled(false);refresh.setEnabled(false);sort.setEnabled(false);help=new Button("使用说明");save=new Button("保存结果");save.setEnabled(false);out=new TextField(50);for(int i=0;i<10;i+)personvotei=new TextField(80);Panel p=new Panel();Panel p1=new Panel();Panel p2=new Panel();Panel p3=new Panel();Panel p4=new Panel();Panel p5=new Panel();Panel p6=new Panel();Panel p7=new Panel();Panel pa=new Panel();Panel pb=new Panel();Panel pc=new Panel();setLayout(new BorderLayout();pa.setLayout(new GridLayout(7,1);pb.setLayout(new BorderLayout();p4.setLayout(new GridLayout(1,5);p5.setLayout(new GridLayout(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(int i=0;i<5;i+)/创建候选人选项candidatei=new Checkbox(candidatelisti);p4.add(candidatei);for(int i=5;i<10;i+)/创建候选人选项candidatei=new Checkbox(candidatelisti);p5.add(candidatei);for(int j=0;j<10;j+)candidatej.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(new GridLayout(10,1);for(int i=0;i<10;i+) p.add(personvotei);ScrollPane scroll=new ScrollPane();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);/面板的布局public void start()/循环播放音乐music.loop();public void stop()/结束播放music.stop();public void actionPerformed(ActionEvent e)/注册监听String s=e.getActionCommand();if(s.equals("确认")confirm1.setEnabled(false);save.setEnabled(true);confirm2.setEnabled(true);refresh.setEnabled(true);sort.setEnabled(true);help.setEnabled(true);String g=canditate.getText();/获取输入的候选人StringTokenizer st=new StringTokenizer(g);/字符串分析器peoplenumble=st.countTokens();/统计候选人数int i=0;while(st.hasMoreTokens()candidatelisti=st.nextToken();i+;/获取语言符号(候选人名单)for(int j=0;j<10;j+)candidatej.setLabel(candidatelistj);/将候选人名单添加到复选框里for(int j=0;j<peoplenumble;j+)candidatej.setEnabled(true);for(int j=peoplenumble;j<10;j+)candidatej.setVisible(false);/多余的选框设置为不可见if(s.equals("取消")/重新设置候选人,进行重新投票confirm1.setEnabled(true);canditate.setText("");if(s.equals("确定")totalvote+;count1=0;sort.setEnabled(true); for(int j=0;j<10;j+) if(candidatej.getState() count1+;/统计选了多少人 if(count1=0) abstention+;/一个都没选则选票作为弃权 if(count1>3) invalidatedTicket+;/选的人数超过3个则选票作废 if(count1<=3&&count1>0) for(int j=0;j<peoplenumble;j+) if(candidatej.getState() countj+; /统计候选人所得票数for(int j=0;j<10;j+)candidatej.setState(false);for(int j=0;j<10;j+)candidatej.setState(false);/清空选框中的勾out.setText("已经统计了:"+totalvote+"张选票,其中弃权票:"+abstention+"作废票:"+invalidatedTicket);/输出统计结果 for(int j=0;j<peoplenumble;j+) personvotej.setText(""+candidatelistj+"得票数:"+countj);/输出各个候选人得票数 if(s.equals("刷新")confirm1.setEnabled(true);confirm2.setEnabled(false);refresh.setEnabled(false);sort.setEnabled(false);save.setEnabled(false);totalvote=0; peoplenumble=0; count1=0;invalidatedTicket=0;abstention=0;canditate.setText("");out.setText("");for(int j=0;j<10;j+)candidatej.setState(false);for(int j=peoplenumble;j<10;j+)candidatej.setVisible(true);for(int j=0;j<10;j+)candidatelistj=""for(int j=0;j<10;j+)countj=0;for(int j=0;j<10;j+)candidatej.setLabel(candidatelistj);for(int j=0;j<10;j+)personvotej.setText("");if(s.equals("排序")sort.setEnabled(false);int m;String n;for(int j=0;j<peoplenumble;j+)for(int i=j+1;i<peoplenumble;i+)if(countj<counti)m=countj;countj=counti;counti=m;n=candidatelistj;candidatelistj=candidatelisti;candidatelisti=n;/按得票数由多到少进行排序for(int j=0;j<peoplenumble;j+)personvotej.setText(""+candidatelistj+"得票数:"+countj);/输出排序后各候选人的票数if(s.equals("使用说明")new Help();if(s.equals("保存结果")new Save();class Help extends Frame/“使用说明”的弹出窗体Panel p=new Panel();TextField help=new TextField6;Help()super("使用说明");p.setLayout(new GridLayout(6,1);for(int i=0;i<6;i+)helpi=new TextField(10);for(int i=0;i<6;i+) p.add(helpi);ScrollPane scroll=new ScrollPane();scroll.add(p);add(scroll); help0.setText("使用说明:"); help1.setText("1:在文本框中输入候选人名单,点击“确认”以完成候选人的设置,点击“取消”可以重新设置候选人。"); help2.setText("2:对候选人进行投票,点击下面的“确定”以确认选票。(注意:每点一次确定将产生一张选票!)"); help3.setText("3:确定选票后,会自动统计结果,点击“排序”可以对候选人所得的票数由高到低进行排序。"); help4.setText("4:点击“刷新”可以重新设置候选人,并开始新的一轮投票"); help5.setText("5:在任何时候可以点击“使用说明”来查看帮助,点击“保存结果”,可以将统计以文本的形式显示出来。");setSize(600,200);setVisible(true);addWindowListener(new closeWin();class closeWin extends WindowAdapterpublic void windowClosing(WindowEvent e)Window w=e.getWindow();w.dispose();class Save extends Frame/“保存结果”的弹出窗体TextArea save;Save()super("统计结果");save=new TextArea(11,1);add(save);save.setText(out.getText()+'n'+personvote0.getText()+'n'+personvote1.getText()+'n'+personvote2.getText()+'n'+personvote3.getText()+'n'+personvote4.getText()+'n'+personvote5.getText()+'n'+personvote6.getText()+'n'+personvote7.getText()+'n'+personvote8.getText()+'n'+personvote9.getText()+'n');setSize(300,300);setVisible(true);addWindowListener(new closeWin();class closeWin extends WindowAdapterpublic void windowClosing(WindowEvent e)Window w=e.getWindow();w.dispose();五、运行调试与分析讨论 运行后的主界面(背景音乐响起)部分按钮已禁用 点击“使用说明”后弹出的帮助文档输入候选人点击“确认”后,候选人出现在选票上,之前多余的选框没有显示出来选择候选人,点击“确定”后自动统计出结果,并清空上一次选框中的勾 点击“排序”后,候选人根据票数由高到低排列点击“保存结果”弹出一个统计结果的窗体可以对其进行复制,方便保存点击“刷新”所有数据清空回到主界面,此时可以进行下一轮投票六、 设计体会与小结 做这个课程设计我最大的体会就是不仅熟练地掌握了书本上的知识,还学到了很多书本上没有的知识。虽然在很早以前就把这个程序写好了,也实现了基本功能,但老师每次看完之后都能够给我一些改进的建议,按照老师的建议,我不厌其烦的把程序改了又改,从老师那我了解到,一个好的程序,应该能让别人容易读懂,所以变量名尽量用英文单词而不要用单个字母表示,还有代码中应该要有足够多的注释。当遇到某个功能无法实现时,我会上网先百度,看看网上有没有好的解决方案,实在找不到的话就去问老师,通过老师提供的接口、类之类的,然后查询那个帮助文档。我想一个人只有到了紧要关头才会奋力一搏吧,通过课程设计,更加深入的了解了java,想当初刚学java的时候,输出Hello Word!都能让自己激动半天,我想我们在学东西的时候,兴趣真的很重要,以前学java时还感觉不到它的趣味性,可是学到后面GUI时,才发现java很有趣,自己照着书上把代码打上去运行,几乎每个例题都有在电脑上试验过吧,所以每次做上机实验时就仿照书上的写,我想,学计算机语言最大的喜悦就是当一个程序按照自己所想要的结果运行出来吧!我觉得帮助别人也是一种学习,当有朋友让我帮忙时,我会很乐意,因为在帮助别人的同时,会迫使自己去学习新的东西。通过做这个投票管理系统,让我对于Applet更加深入的了解了,还有部件的布局也更熟练了。我想,学习是个不间断的过程,如果真正想学好一门语言的话,光靠课程设计这段时间是远远不够的,所以凡事还是贵在坚持,我看过有些同学过两天就换一个课设题目,我问他为什么,他说还有几个错误怎么都找不出来,于是就换题了。能顺利的完成这次课设,我非常感谢我的java老师*,是她给予了我很多帮助,教会了我很多东西,谢谢! 七、参考文献1 丁振凡. Java语言实用教程(第1版)M. 北京:北京邮电大学出版社,2005.2