Java编程之小型抽奖系统—导入手机号和姓名

版权声明:此篇博文为博主心血o(╥﹏╥)o,如要转载请注明来源,勿忘心安! https://blog.csdn.net/dyq1995/article/details/88362042

问题描述:请使用Java编程实现小型的抽奖系统,要求导入手机号和姓名作为初始信息。

问题分析:

导入的文件格式是txt文本格式,文件的内容可以有上千百万个用户和手机号构成,格式如下:

叶尔凯西-15292760029

革命-13070317800

热依古丽-13070317811

杰格尔-15894139220

小叶-15299208037

大爷-13699382904

小花-13894353333

系统最少要输入7名用户,三等奖3名,二等奖2名,一等奖1名,特等奖1名;下面是Java源代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class ChooseAward extends JFrame
{
        /**
         * 
         */
        //系统自动生成
        private static final long serialVersionUID = 7510608124693852355L;

        JButton b_start = new JButton("开始");

        JButton b_stop = new JButton("停止");
        
        
        JPanel p_north=new JPanel();
        JPanel p_center=new JPanel();
        JPanel p_south=new JPanel();

        //菜单栏
        JMenuBar menubar=new JMenuBar();
        
        //菜单项
        JMenu fileMenu=new JMenu("文件");
        JMenu setMenu=new JMenu("设置");
        JMenu aboutMenu=new JMenu("关于");
        
        /*
         * 菜单子项
         */
        private JMenuItem[] filem={new JMenuItem("选择文件"),new JMenuItem("另存为.."),
                        new JMenuItem("保存"),new JMenuItem("退出")
        };
        
        
        JTextField t_identNumber = new JTextField(); // 身份证号的文本域

        Vector v_identNumber = new Vector(); // 存放读取出来的身份证的号码

        Vector v_name = new Vector(); // 存放读取出来的人的姓名

        Vector v_printident = new Vector(); // 存放中奖人的身份证号码

        JLabel l_information = new JLabel();

        JLabel l_identNumber = new JLabel();

        JLabel l_sysinformation = new JLabel("系统信息:");

        JFileChooser filechooser = new JFileChooser(); // 文件选择器

        //选择随机数的线成
        public ChooseThread awardThread = null;

        int chooseTime = 0; // 按下停止按钮的次数,也就是抽奖的次数

        public ChooseAward()
        {
                super("小型抽奖系统");
                t_identNumber.setEditable(false);
                /*
                 * 1.4以后的JDK可以不用Container
                 */
                Container contentPane = getContentPane();
                //BorderLayout布局管理器,东,南,西,北
                contentPane.setLayout(new BorderLayout());
                /*
                 * 给几个按钮和子菜单添加监听器
                 */
                filem[0].addActionListener(new ActionListener()
                {
                        // 注册加载事件的监听器
                        public void actionPerformed(ActionEvent e)
                        {
                                b_loadident_ActionPerformed(e);
                                }
                        });
                b_start.addActionListener(new ActionListener()
                {          
                        // 注册开始事件的监听器
                                        public void actionPerformed(ActionEvent e)
                                        {
                                                b_start_ActionPerformed(e);
                                        }
                                });
                b_stop.addActionListener(new ActionListener()
                {// 注册停止事件的监听器
                                        public void actionPerformed(ActionEvent e)
                                        {
                                                b_stop_ActionPerformed(e);
                                        }
                                });
                filem[2].addActionListener(new ActionListener()
                {// 注册打印事件的监听器
                                        public void actionPerformed(ActionEvent e)
                                        {
                                                b_printaward_ActionPerformed(e);
                                        }
                                });
                addWindowListener(new WindowAdapter()
                {
                        public void windowClosing(WindowEvent e)
                        {
                                System.exit(0);
                        }
                });
                //将菜单子项加入菜单中
                for(int i=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(new FlowLayout(FlowLayout.LEFT));
                l_information.setForeground(Color.blue);
                p_south.add(l_sysinformation);
                p_south.add(l_information);
                contentPane.add(p_south,BorderLayout.SOUTH);
                
                
                
                
                
                
                
                /*
                 * 设置的一些显示方式,字体,大小等,为了尽量美观一点
                 */
                Font xuehao=new Font("null",Font.PLAIN,30);
                l_identNumber.setFont(xuehao);
                //字体的居中对齐
                l_identNumber.setHorizontalAlignment(0);
                l_identNumber.setText("手机号");
                
                
                Font number=new Font("null",Font.BOLD,30);//粗体
                t_identNumber.setFont(number);
                //设置字体颜色
                t_identNumber.setForeground(Color.red);
                t_identNumber.setHorizontalAlignment(0);
                
                
                
                //给上面的jpanel设置布局
                p_north.setLayout(new GridLayout(2,1));
                p_north.add(l_identNumber);
                p_north.add(t_identNumber);
                
                
                contentPane.add(p_north,BorderLayout.NORTH);
                //给中间的jpanel 设置布局
                p_center.setLayout(new GridLayout(1,2,10,0));
                
                p_center.add(b_start);
                p_center.add(b_stop);
                
                
                
                contentPane.add(p_center,BorderLayout.CENTER);
                
        }

        /*
         * 加载按钮事件方法
         */
        public void b_loadident_ActionPerformed(ActionEvent e)
        {
                int k = 0;
                chooseTime = 0;
                //从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
                BufferedReader reader = null;
                //此方法会返回一个int值
                int i = filechooser.showOpenDialog(this); // 显示打开文件对话框
                /*
                 * 确实所选择的是对话框上的确定按钮
                 */
                if (i == JFileChooser.APPROVE_OPTION)
                { // 点击对话框中打开选项
                        File f = filechooser.getSelectedFile(); // 得到所选择的文件
                        try
                        {
                                l_information.setText("数据加载中,请稍等...");
                                //读取字符流
                                reader = new BufferedReader(new FileReader(f));
                                //循环读取
                                while (true)
                                {
                                        //读取一个文本行
                                        String data = reader.readLine();
                                        System.out.println(data);//开发时候测试用
//                                        读完了数据
                                        if (data == null)
                                        {
                                                l_information.setText("数据加载完成!");
                                            break;
                                        }
                                        
                                        //通过“-”这个符号将 字符串分离为两部分,再存放到向量里面
                                        Vector v = this.apart(data, "-");
                                        //System.out.println(data);//开发时候测试用
                                        if (v == null)
                                        {
                                                l_information.setText("数据格式不正确,请重新加载!");
                                                return;
                                        }

                                        /*
                                         * 分别将分离开来的手机号码,和姓名分别放入两个可变向量当中
                                         * 这里应该使用泛型,由于本人还没有熟练掌握泛型,姑且放之
                                         * 
                                         * 
                                         * 捕获异常,看是否出现了格式错误,因为一般出现了格式错误
                                         * 这两条语句都会发生无法取得元素的错误
                                         */
                                        try
                                        {
                                        v_identNumber.add(k, v.elementAt(0)); 
                                        v_name.add(k, v.elementAt(1)); 
                                        k++;
                                        }
                                        
                                        catch(Exception e4)
                                        {
                                                System.out.println("格式中没有分隔符号出现的错误");
                                                //JOptionPane.showMessageDialog(this, "导入的数据格式错误!");
                                                l_information.setText("导入的数据格式错误!");
                                                break;
                                        }

                                }
                        } catch (Exception ex)
                        {
                                ex.printStackTrace(); // 输出出错信息
                        }
                }
        }

        /*
         * 启动按钮的事件
         */
        public void b_start_ActionPerformed(ActionEvent e)
        {
                //判断存储两个标记的向量中是否为空
                if (v_identNumber.size() <= 0 || v_name.size() <= 0)
                {
                        l_information.setText("数据没有加载,请加载数据!");
                }
                else
                {
                        if (chooseTime > 6)
                        {
                                l_information.setText("抽奖结束,若要再进行一次须重新启动程序!");
                        } 
                        else//执行....
                        {
                                awardThread = new ChooseThread(this);
                                awardThread.changeflag_start();
                                l_information.setText("将产生:特(1名),一(1名),二(2名),三(3名)等奖");
                                l_identNumber.setText("选取中...");
                                b_start.setEnabled(false);
                                b_stop.setEnabled(true);
                        }
                }
        }

        /*
         * 暂停按钮的事件
         */
        public void b_stop_ActionPerformed(ActionEvent e)
        {
                //将跳转的数字置于停止状态
                awardThread.changeflag_stop();
                String awardmessage = "";
                chooseTime++;//第几次按停止按钮
                String str_name = "";
                String message="";
                /*
                 * 根据第几次来按停止按钮来决定是产生几等奖
                 */
                switch (chooseTime)
                {
                case 1:
                case 2:        
                case 3://按前三次都是产生三等奖        
                        //寻找停止在号码框中的数字,是对应的的存放号码的向量中的第几个
                        for (int k = 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);
                                        break;//跳出循环
                                }
                        }
                        l_identNumber.setText("三等奖");
                        b_start.setText("继续");
                        //这是要输出到文本文件的信息
                        awardmessage = "三等奖  " + t_identNumber.getText() + str_name + "\r\n";
                        //将要打印的文本信息先存放到一个可变向量中
                        v_printident.addElement(awardmessage);//系统提示说要使用泛型,本人不会用,以后再研究
                        message = "第"+chooseTime+"位三等奖得主为:  "+str_name;
                        JOptionPane.showMessageDialog(this, message);
                        break;
                case 4:
                case 5:
                        for (int k = 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);
                                        break;
                                }
                        }
                        l_identNumber.setText("二等奖");
                        awardmessage = "二等奖  " + t_identNumber.getText() + str_name + "\r\n";
                        v_printident.addElement(awardmessage);
                        int serial=chooseTime-3;//第几位得主,排名序号
                        message = "第"+serial+"位二等奖得主为:  "+str_name;
                        JOptionPane.showMessageDialog(ChooseAward.this, message);
                        break;
                case 6:
                        for(int k=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);
                                        break;
                                }
                        }
                        l_identNumber.setText("一等奖");
                        awardmessage = "一等奖  " + t_identNumber.getText() + str_name + "\r\n";
                        v_printident.addElement(awardmessage);
                        /*
                         * 第几位得主,排名序号,其实没必要这样写,因为本来就这一名
                         * 现在这样写的作用是为我以后改进这个程序(可以自主选择产生几名得奖主)
                         * 的时候做好准备
                         */
                        //serial=chooseTime-5;
                        //message = "第"+serial+"位二等奖得主为:  "+str_name;
                        message = "一等奖得主为:  "+str_name;
                        JOptionPane.showMessageDialog(ChooseAward.this, message);
                        break;
                case 7:
                        for (int k = 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);
                                        break;
                                }
                        }
                        l_identNumber.setText("特等奖");
                        awardmessage = "特等奖" + t_identNumber.getText() + str_name + "\r\n";
                        v_printident.addElement(awardmessage);
                        message = "特等奖得主为:  "+str_name;
                        JOptionPane.showMessageDialog(ChooseAward.this, message);
                        l_information.setText("此次抽奖全部结束,保存抽奖结果!");
                        break;
                default:
                        JOptionPane.showMessageDialog(ChooseAward.this, "抽奖已经结束");
                        b_start.setText("开始");
                        awardThread.changeflag_stop();
                        break;
                }
                b_start.setEnabled(true);
                b_stop.setEnabled(false);
        }

        /*
         * 输出按钮的事件
         */
        public void b_printaward_ActionPerformed(ActionEvent e)
        {
                try
                {
                        FileOutputStream fs_out = new FileOutputStream("result.txt");
                        DataOutputStream out = new DataOutputStream(fs_out);
                        for (int i = 0; i < v_printident.size(); i++)
                        {
                                System.out.println(v_printident.elementAt(i));//测试用
                                out.writeUTF((String) v_printident.elementAt(i) + "\r\n");
                        }
                        out.close();
                        l_information.setText("文件输出成功!保存在当前目录下..");
                } catch (FileNotFoundException fe)
                {
                        System.err.println(fe);
                } catch (IOException ioe)
                {
                        System.err.println(ioe);
                }

        }

        /*
         * 定义一个方法,将号码和名字分离开来
         */
        //一个是源数据文件,一个是分隔符号
        public Vector apart(String src, String separator)
        {
                //使用了泛型,用可变向量来存放等到的标记
                Vector<String> v = new Vector<String>();
                /*
                 * string tokenizer 类允许应用程序将字符串分解为标记,祥见api文档
                 */
                //src是源字符串,separator是把src分隔为几段的标记
                StringTokenizer st = new StringTokenizer(src, separator);
                //测试此 tokenizer 的字符串中是否还有更多的可用标记
                while (st.hasMoreTokens())
                {
                        //返回此 string tokenizer 的下一个标记,并将它加入到可变向量中存放
                        v.addElement(st.nextToken());
                }
                return v;//返回向量
        }

        /*
         * 程序的入口
         */
        public static void main(String[] args)
        {
                //根据经验,这条语句只能在第一行
                JFrame.setDefaultLookAndFeelDecorated(true);
                ChooseAward award = new ChooseAward();
                award.setSize(333, 209);
                award.setLocationRelativeTo(null);//居中显示
                award.setVisible(true);
                award.setAlwaysOnTop(true);//置顶
                award.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
}

/*
* 定义的线程类,该线呈是循环的显示号码
*/
class ChooseThread extends Thread
{
        private boolean runFlag = true;//决定此线程是否运行的标记
    //需要该对象来读取文本框字段,不用创建它,申明下就好
        private ChooseAward chooseAward = null;
        //创建一个新的随机数生成器
        Random randomNumber = new Random();

        public ChooseThread(Object obj)
        {
                start();
                chooseAward = (ChooseAward) obj;
        }

        public void start()
        {
                runFlag = false;
                super.start();
        }

        public void changeflag_start()
        {
                runFlag = true;
        }

        public void changeflag_stop()
        {
                runFlag = false;
        }

        /*
         *实现文本框滚动的效果
         */
        public void run()
        {
                while (runFlag)
                {
                        /*
                         * 返回一个伪随机数,它是从此随机数生成器的序列中取出的
                         * 、在 0(包括)和指定值(不包括)之间均匀分布的 int值
                         */
                        //返回向量中存储了几个号码的随便一个序号
                        int num = randomNumber.nextInt(chooseAward.v_identNumber.size());
                //显示那个选种的序号对应的号码
                        chooseAward.t_identNumber.setText((String) chooseAward.v_identNumber
                                        .elementAt(num));
                        try
                        {
                                sleep(50);
                        } 
                        catch (Exception e)
                        {
                                e.printStackTrace();
                        }
                }
        }
}

猜你喜欢

转载自blog.csdn.net/dyq1995/article/details/88362042
今日推荐