java抽奖程序课程设计Word文件下载.docx
《java抽奖程序课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《java抽奖程序课程设计Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
产生中奖
显示抽奖结果
图1抽奖系统业务流程图
三、系统的设计
此小程序的基本流程是,在一个文本文件存放里面备选的数据,数据的格式是每行有姓名和手机号他们之间是用分隔符-来分隔的。
然后在自定义一个方法,通过分隔符来区分姓名和手机号,然后将他们分别存储进两个不同的可变向量当中。
自定义一个线程,此线程是专门用来随机选取一个号码,并且每隔50毫秒就将一个不同的号码显示在号码框中,这样就实现了号码的快速滚动,实现了完全模拟电视当中抽奖的画面为了实现选取出的一个号码不能再被选种,实现的方法是将他们从可变向量中清除出去。
此程序首先从四等奖开始抽取四人,三等奖抽取三人,二等奖抽取二人,一等奖一人,特等奖一人。
抽奖功能流程图
四、系统测试
程序测试如下图:
五、总结
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路。
在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
我们通过查阅大量有关资料,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力。
附件
六、程序代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
importjava.util.*;
publicclassChooseAwardextendsJFrame
{
/**
*
*/
//系统自动生成
privatestaticfinallongserialVersionUID=55L;
JButtonb_start=newJButton("
开始"
);
JButtonb_stop=newJButton("
停止"
JPanelp_north=newJPanel();
JPanelp_center=newJPanel();
JPanelp_south=newJPanel();
//菜单栏
JMenuBarmenubar=newJMenuBar();
//菜单项
JMenufileMenu=newJMenu("
文件"
JMenusetMenu=newJMenu("
设置"
JMenuaboutMenu=newJMenu("
关于"
/*
*菜单子项
privateJMenuItem[]filem={newJMenuItem("
选择文件"
),newJMenuItem("
另存为.."
),
newJMenuItem("
保存"
退出"
)
};
JTextFieldt_identNumber=newJTextField();
//身份证号的文本域
Vectorv_identNumber=newVector();
//存放读取出来的身份证的号码
Vectorv_name=newVector();
//存放读取出来的人的姓名
Vectorv_printident=newVector();
//存放中奖人的身份证号码
JLabell_information=newJLabel();
JLabell_identNumber=newJLabel();
JLabell_sysinformation=newJLabel("
系统信息:
"
JFileChooserfilechooser=newJFileChooser();
//文件选择器
//选择随机数的线成
publicChooseThreadawardThread=null;
intchooseTime=0;
//按下停止按钮的次数,也就是抽奖的次数
publicChooseAward()
{
super("
小型抽奖系统"
t_identNumber.setEditable(false);
*1.4以后的JDK可以不用Container
ContainercontentPane=getContentPane();
//BorderLayout布局管理器,东,南,西,北
contentPane.setLayout(newBorderLayout());
*给几个按钮和子菜单添加监听器
filem[0].addActionListener(newActionListener()
//注册加载事件的监听器
publicvoidactionPerformed(ActionEvente)
b_loadident_ActionPerformed(e);
}
});
b_start.addActionListener(newActionListener()
{
//注册开始事件的监听器
b_start_ActionPerformed(e);
b_stop.addActionListener(newActionListener()
{//注册停止事件的监听器
b_stop_ActionPerformed(e);
filem[2].addActionListener(newActionListener()
{//注册打印事件的监听器
b_printaward_ActionPerformed(e);
addWindowListener(newWindowAdapter()
publicvoidwindowClosing(WindowEvente)
System.exit(0);
//将菜单子项加入菜单中
for(inti=0;
i<
filem.length;
i++)
fileMenu.add(filem[i]);
//加入分隔线,为了美观
fileMenu.addSeparator();
//将菜单条加入frame中
menubar.add(fileMenu);
menubar.add(setMenu);
menubar.add(aboutMenu);
setJMenuBar(menubar);
/*将p_north设计为一个状态栏,显示一些操作过程中的信息
*创建一个左对齐方式的流布局
p_south.setLayout(newFlowLayout(FlowLayout.LEFT));
l_information.setForeground(Color.blue);
p_south.add(l_sysinformation);
p_south.add(l_information);
contentPane.add(p_south,BorderLayout.SOUTH);
*设置的一些显示方式,字体,大小等,为了尽量美观一点
Fontxuehao=newFont("
null"
Font.PLAIN,30);
l_identNumber.setFont(xuehao);
//字体的居中对齐
l_identNumber.setHorizontalAlignment(0);
l_identNumber.setText("
手机号"
Fontnumber=newFont("
Font.BOLD,30);
//粗体
t_identNumber.setFont(number);
//设置字体颜色
t_identNumber.setForeground(Color.red);
t_identNumber.setHorizontalAlignment(0);
//给上面的jpanel设置布局
p_north.setLayout(newGridLayout(2,1));
p_north.add(l_identNumber);
p_north.add(t_identNumber);
contentPane.add(p_north,BorderLayout.NORTH);
//给中间的jpanel设置布局
p_center.setLayout(newGridLayout(1,2,10,0));
p_center.add(b_start);
p_center.add(b_stop);
contentPane.add(p_center,BorderLayout.CENTER);
*加载按钮事件方法
publicvoidb_loadident_ActionPerformed(ActionEvente)
intk=0;
chooseTime=0;
//从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedReaderreader=null;
//此方法会返回一个int值
inti=filechooser.showOpenDialog(this);
//显示打开文件对话框
*确实所选择的是对话框上的确定按钮
if(i==JFileChooser.APPROVE_OPTION)
{//点击对话框中打开选项
Filef=filechooser.getSelectedFile();
//得到所选择的文件
try
l_information.setText("
数据加载中,请稍等..."
//读取字符流
reader=newBufferedReader(newFileReader(f));
//循环读取
while(true)
//读取一个文本行
Stringdata=reader.readLine();
System.out.println(data);
//开发时候测试用
//读完了数据
if(data==null)
数据加载完成!
break;
//通过“-”这个符号将字符串分离为两部分,再存放到向量里面
Vectorv=this.apart(data,"
-"
//System.out.println(data);
if(v==null)
数据格式不正确,请重新加载!
return;
*分别将分离开来的手机号码,和姓名分别放入两个可变向量当中
*这里应该使用泛型,由于本人还没有熟练掌握泛型,姑且放之
*捕获异常,看是否出现了格式错误,因为一般出现了格式错误
*这两条语句都会发生无法取得元素的错误
v_identNumber.add(k,v.elementAt(0));
v_name.add(k,v.elementAt
(1));
k++;
catch(Exceptione4)
System.out.println("
格式中没有分隔符号出现的错误"
//JOptionPane.showMessageDialog(this,"
导入的数据格式错误!
}catch(Exceptionex)
ex.printStackTrace();
//输出出错信息
*启动按钮的事件
publicvoidb_start_ActionPerformed(ActionEvente)
//判断存储两个标记的向量中是否为空
if(v_identNumber.size()<
=0||v_name.size()<
=0)
数据没有加载,请加载数据!
else
if(chooseTime>
11)
抽奖结束,若要再进行一次须重新启动程序!
}
else//执行....
awardThread=newChooseThread(this);
awardThread.changeflag_start();
将产生:
特(1名),一(1名),二(2名),三(3名)等奖,四(4名)等奖"
选取中..."
b_start.setEnabled(false);
b_stop.setEnabled(true);
*暂停按钮的事件
publicvoidb_stop_ActionPerformed(ActionEvente)
//将跳转的数字置于停止状态
awardThread.changeflag_stop();
Stringawardmessage="
;
chooseTime++;
//第几次按停止按钮
Stringstr_name="
Stringmessage="
*根据第几次来按停止按钮来决定是产生几等奖
switch(chooseTime)
case1:
case2:
case3:
case4:
//按前三次都是产生三等奖
//寻找停止在号码框中的数字,是对应的的存放号码的向量中的第几个
for(intk=0;
k<
v_identNumber.size();
k++)
//找到了对应的号码
if((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
//取出这个号码对应的名字
str_name=(String)v_name.elementAt(k);
//为防止下次抽的时候再抽到相同的号码,所以把它们从向量中移除掉
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);
//跳出循环
四等奖"
b_start.setText("
继续"
//这是要输出到文本文件的信息
awardmessage="
四等奖"
+t_identNumber.getText()+str_name+"
\r\n"
//将要打印的文本信息先存放到一个可变向量中
v_printident.addElement(awardmessage);
message="
第"
+chooseTime+"
位四等奖得主为:
"
+str_name;
JOptionPane.showMessageDialog(this,message);
case5:
case6:
case7:
三等奖"
三等奖"
//系统提示说要使用泛型,本人不会用,以后再研究
intserial1=chooseTime-4;
+serial1+"
位三等奖得主为:
case8:
case9:
if(t_identNumber.getText().equals(v_identNumber.elementAt(k)))
二等奖"
二等奖"
intserial=chooseTime-7;
//第几位得主,排名序号
+serial+"
位二等奖得主为:
JOptionPane.showMessageDialog(ChooseAward.this,message);
case10:
for(intk=0;
k<
v_identNumber.size();
k++)
if(t_identNumber.getText().equals(v_identNumber.elementAt(k)))
str_name=(String)v_name.elementAt(k);
一等奖"
一等奖"
*第几位得主,排名序号,其实没必要这样写,因为本来就这一名
*现在这样写的作用是为我以后改进这个程序(可以自主选择产生几名得奖主)
*的时候做好准备
//serial=chooseTime-5;
//message="
一等奖得主为:
case11:
for(intk=0;