package youg; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.Panel; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.filechooser.FileNameExtensionFilter; public class ChooseAward extends JFrame { /** * */ //系统自动生成 private static final long serialVersionUID = 7510608124693852355L; int width=0; int height=0;//窗口大小 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(); JPanel dongzuo=new JPanel(); //菜单栏 JMenuBar menubar=new JMenuBar(); //菜单项 JMenu fileMenu=new JMenu("文件"); JMenu setMenu=new JMenu("设置"); JMenu helpMenu=new JMenu("帮助"); JMenu aboutMenu=new JMenu("关于"); /* * 菜单子项 */ private JMenuItem[] filem={new JMenuItem("选择文件"),new JMenuItem("另存为.."), new JMenuItem("保存"),new JMenuItem("退出") }; private JMenuItem[] filew={new JMenuItem("关于我们")}; private JMenuItem[] fileh={new JMenuItem("查看帮助")}; private JMenuItem[] files={new JMenuItem("设置标题"),new JMenuItem("设置背景")}; JTextField t_identNumber = new JTextField(); // 手机号的文本域 Vector<String> v_identNumber = new Vector<String>(); // 存放读取出来的号码 Vector<String> v_name = new Vector<String>(); // 存放读取出来的人的姓名 Vector<String> z_identNumber = new Vector<String>(); // 存放号码 Vector<String> z_name = new Vector<String>(); // 存放姓名 Vector<String> v_printident = new Vector<String>(); // 存放中奖人的信息 Vector<String> v_printident1 = new Vector<String>(); // 存放中奖人的信息 Vector<String> v_printident2 = new Vector<String>(); // 存放中奖人的信息 Vector<String> v_printident3 = new Vector<String>(); // 存放中奖人的信息 JLabel l_biaoti = new JLabel(); JLabel l_information = new JLabel(); JLabel l_identNumber = new JLabel(); JLabel l_one = new JLabel("一等奖"); JLabel l_two = new JLabel("二等奖"); JLabel l_three = new JLabel("三等奖"); JLabel l_jieguo_one = new JLabel(); JLabel l_jieguo_two = new JLabel(); JLabel l_jieguo_three = new JLabel(); JLabel l_sysinformation = new JLabel("系统信息:"); JFileChooser filechooser = new JFileChooser(); // 文件选择器 ReadExcel re=new ReadExcel();//读取excel文件的类 //选择随机数的线成 public ChooseThread awardThread = null; private static int level=1; int chooseTime = 0; // 按下停止按钮的次数,也就是抽奖的次数 contentPane contentP=new contentPane(); public ChooseAward() { super("**抽奖系统"); width=(int) (this.getScreenSize().getWidth()); height=(int) (this.getScreenSize().getHeight()-40); contentP.setImgPath(Panel.class.getResource("/background/mubu.jpg")); this.add(contentP); this.setSize(width, height); t_identNumber.setEditable(false);//设置手机号码区不可编辑 //BorderLayout布局管理器,东,南,西,北 contentP.setLayout(new BorderLayout()); /* * 给几个按钮和子菜单添加监听器 */ //添加监听(选择文件) filem[0].addActionListener(new ActionListener() { // 注册加载事件的监听器 public void actionPerformed(ActionEvent e) { b_loadident_ActionPerformed(e); } }); //添加监听(另存为) filem[1].addActionListener(new ActionListener() { // 注册加载事件的监听器 public void actionPerformed(ActionEvent e) { lc_loadident_ActionPerformed(e); } }); //添加监听(保存) filem[2].addActionListener(new ActionListener() { // 注册保存事件的监听器 public void actionPerformed(ActionEvent e) { b_printaward_ActionPerformed(e); } }); //添加监听(退出) filem[3].addActionListener(new ActionListener() { // 注册退出事件的监听器 public void actionPerformed(ActionEvent e) { b_exit_ActionPerformed(e); } }); //添加监听(帮助) fileh[0].addActionListener(new ActionListener() { // 注册帮助事件的监听器 public void actionPerformed(ActionEvent e) { b_help_ActionPerformed(e); } }); //添加监听(设置标题) files[0].addActionListener(new ActionListener() { // 注册设置标题事件的监听器 public void actionPerformed(ActionEvent e) { b_setTitle_ActionPerformed(e); } }); //添加监听(设置背景) files[1].addActionListener(new ActionListener() { // 注册背景事件的监听器 public void actionPerformed(ActionEvent e) { b_setBack_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); } }); //windows窗口关闭事件 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //添加监听(关于) filew[0].addActionListener(new ActionListener() { // 注册加载事件的监听器 public void actionPerformed(ActionEvent e) { about_loadident_ActionPerformed(e); } }); //添加文件子菜单 for(int i=0;i<filem.length;i++) { fileMenu.add(filem[i]); //加入分隔线,为了美观 fileMenu.addSeparator(); } //添加设置子菜单 for(int i=0;i<files.length;i++) { setMenu.add(files[i]); //加入分隔线,为了美观 setMenu.addSeparator(); } //添加关于子菜单 for(int i=0;i<filew.length;i++) { aboutMenu.add(filew[i]); //加入分隔线,为了美观 aboutMenu.addSeparator(); } //添加帮助子菜单 for(int i=0;i<fileh.length;i++) { helpMenu.add(fileh[i]); //加入分隔线,为了美观 helpMenu.addSeparator(); } //将菜单条加入frame中 menubar.add(fileMenu); menubar.add(setMenu); menubar.add(helpMenu); menubar.add(aboutMenu); setJMenuBar(menubar); /*将p_south设计为一个状态栏,显示一些操作过程中的信息 * 创建一个左对齐方式的流布局 */ p_south.setLayout(new FlowLayout(FlowLayout.LEFT)); p_south.setBackground(null); l_information.setForeground(Color.blue); p_south.add(l_sysinformation); p_south.add(l_information); contentP.add(p_south,BorderLayout.SOUTH); /* * 设置的一些显示方式,字体,大小等,为了尽量美观一点 */ Font biaoti=new Font("null",Font.BOLD,70); l_biaoti.setFont(biaoti); l_biaoti.setForeground(Color.pink); l_biaoti.setHorizontalAlignment(0); l_biaoti.setText("16XXXXXXXXXX"); Font xingming=new Font("null",Font.PLAIN,30); l_identNumber.setFont(xingming); //字体的居中对齐 l_identNumber.setHorizontalAlignment(0); l_identNumber.setText("姓名"); Font number=new Font("null",Font.BOLD,30);//粗体 t_identNumber.setFont(number); //设置字体颜色 t_identNumber.setForeground(Color.gray); t_identNumber.setHorizontalAlignment(0); //给上面的jpanel设置布局 dongzuo.setLayout(new GridLayout(1,2)); dongzuo.setOpaque(false); b_start.setContentAreaFilled(false);// 设置透明 b_start.setBorderPainted(false); b_stop.setContentAreaFilled(false);// 设置透明 b_stop.setBorderPainted(false); dongzuo.add(b_start); dongzuo.add(b_stop); p_north.setLayout(new GridLayout(4,1)); p_north.setOpaque(false); p_north.setBackground(null); p_north.add(l_biaoti); p_north.add(l_identNumber); t_identNumber.setOpaque(false); t_identNumber.setBorder(null); p_north.add(t_identNumber); p_north.add(dongzuo); contentP.add(p_north,BorderLayout.NORTH); //给中间的jpanel 设置布局 p_center.setLayout(new GridLayout(6,1,0,0)); p_center.setOpaque(false); Font t_jieguo=new Font("null",Font.BOLD,25);//粗体 Font jieguo=new Font("null",Font.BOLD,30);//粗体 l_one.setFont(t_jieguo); l_one.setHorizontalAlignment(0); l_jieguo_one.setFont(jieguo); l_jieguo_one.setForeground(Color.black); l_jieguo_one.setHorizontalAlignment(0); l_two.setFont(t_jieguo); l_jieguo_two.setFont(jieguo); l_jieguo_two.setForeground(Color.black); l_jieguo_two.setHorizontalAlignment(0); l_two.setHorizontalAlignment(0); l_three.setFont(t_jieguo); l_jieguo_three.setFont(jieguo); l_jieguo_three.setForeground(Color.black); l_jieguo_three.setHorizontalAlignment(0); l_three.setHorizontalAlignment(0); // p_center.add(b_start); // p_center.add(b_stop); p_center.add(l_one); p_center.add(l_jieguo_one); p_center.add(l_two); p_center.add(l_jieguo_two); p_center.add(l_three); p_center.add(l_jieguo_three); contentP.add(p_center,BorderLayout.CENTER); } /* * 加载按钮事件方法 */ //选择文件事件 public void b_loadident_ActionPerformed(ActionEvent e) { FileNameExtensionFilter filter = new FileNameExtensionFilter("XLS","xls");//建立过滤器 filechooser.setFileFilter(filter);//开始过滤 filechooser.setCurrentDirectory(new File("D:/"));//设置默认目录 打开直接默认D盘 filechooser.setDialogTitle("选择名单"); //自定义选择框标题 //此方法会返回一个int值 int m = filechooser.showOpenDialog(this); // 显示打开文件对话框 /* * 确实所选择的是对话框上的确定按钮 */ if (m == JFileChooser.APPROVE_OPTION)// 点击对话框中打开选项 { Vector<?> vExcel=null;//用于接收读取出来的数据 File f = filechooser.getSelectedFile(); // 得到所选择的文件 String filePath = f.toString(); l_information.setText("数据加载中,请稍等..."); try { vExcel=re.readExcel(filePath); if (vExcel.size() > 0) { l_information.setText("数据加载完成!"); }else{ l_information.setText("没有数据!"); } for(int i=0;i<vExcel.size();i++){ v_identNumber.add((String) vExcel.elementAt(i)); i++; v_name.add((String) vExcel.elementAt(i)); } } catch (Exception e1) { //System.out.println("格式中没有分隔符号出现的错误"); //JOptionPane.showMessageDialog(this, "导入的数据格式错误!"); l_information.setText("导入的数据格式错误!"); } } } //实现退出事件 public void b_exit_ActionPerformed(ActionEvent e){ System.exit(0); } //实现更改标题事件 public void b_setTitle_ActionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(this, "QQ:609429837"+"\r\n"+"谢谢使用!"); } //实现更改背景事件 public void b_setBack_ActionPerformed(ActionEvent e){ FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG","jpg");//建立过滤器 filechooser.setFileFilter(filter);//开始过滤 filechooser.setCurrentDirectory(new File("D:/"));//设置默认目录 打开直接默认D盘 filechooser.setDialogTitle("选择背景"); //自定义选择框标题 //此方法会返回一个int值 int m = filechooser.showOpenDialog(this); // 显示打开文件对话框 /* * 确实所选择的是对话框上的确定按钮 */ if (m == JFileChooser.APPROVE_OPTION)// 点击对话框中打开选项 { File f = filechooser.getSelectedFile(); // 得到所选择的文件 try { contentP.setImgPath(f.toURI().toURL()); } catch (MalformedURLException e1) { e1.toString(); } } } //实现帮助事件 public void b_help_ActionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(this, "选择文件格式为第一列存放姓名第二列存放电话的excl文件(*.xls)"+"\r\n" +"中奖结果的保存格式为文本文档(*.txt)"); } // public void bloadident_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(); // 得到所选择的文件 // System.out.print(f); // 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<String> v = this.apart(data, "-"); // //System.out.println(data);//开发时候测试用 // if (v == null) // { // l_information.setText("数据格式不正确,请重新加载!"); // return; // } // // /* // * 分别将分离开来的手机号码,和姓名分别放入两个可变向量当中 // * 这里应该使用泛型,由于本人还没有熟练掌握泛型,姑且放之 // * // * // * 捕获异常,看是否出现了格式错误,因为一般出现了格式错误 // * 这两条语句都会发生无法取得元素的错误 // */ // try // { // v_identNumber.add(k, (String) v.elementAt(0)); // v_name.add(k, (String) v.elementAt(1)); // k++; // } // // catch(Exception e4) // { // System.out.println("格式中没有分隔符号出现的错误"); // //JOptionPane.showMessageDialog(this, "导入的数据格式错误!"); // l_information.setText("导入的数据格式错误!"); // break; // } // // } // } catch (Exception ex) // { // ex.printStackTrace(); // 输出出错信息 // } // } // } /* * 加载关于按钮的事件 */ //关于事件 public void about_loadident_ActionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(this, "QQ:609429837"+"\r\n"+"谢谢使用!"); } //另存为事件 public void lc_loadident_ActionPerformed(ActionEvent e) { chooseTime = 0; FileNameExtensionFilter filter = new FileNameExtensionFilter("TXT","txt");//建立过滤器 filechooser.setFileFilter(filter);//开始过滤 filechooser.setCurrentDirectory(new File("D:/"));//设置默认目录 打开直接默认D盘 filechooser.setDialogTitle("保存中奖结果"); //自定义选择框标题 filechooser.setSelectedFile(new File("request.txt")); //设置默认文件名 //此方法会返回一个int值 int i = filechooser.showSaveDialog(this);// 显示保存文件对话框 /* * 确实所选择的是对话框上的确定按钮 */ if (i == JFileChooser.APPROVE_OPTION) { // 点击对话框中打开选项 File f = filechooser.getSelectedFile(); // 得到所选择的文件 //文件重名问题 if (f.exists()) { int copy = JOptionPane.showConfirmDialog(null,"是否要覆盖当前文件?", "保存", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); if (copy == JOptionPane.YES_OPTION){ filechooser.approveSelection(); } else { filechooser.approveSelection(); } } try { System.out.print(f); FileOutputStream fs_out = new FileOutputStream(f); DataOutputStream out = new DataOutputStream(fs_out); for (int m = 0; m < v_printident.size(); m++) { System.out.println(v_printident.elementAt(m));//测试用 out.writeUTF((String) v_printident.elementAt(m) + "\r\n"); } out.close(); l_information.setText("文件保存成功.."); }catch (FileNotFoundException fe) { System.err.println(fe); } catch (IOException ioe) { System.err.println(ioe); } } /* * 分别将分离开来的手机号码,和姓名分别放入两个可变向量当中 * 这里应该使用泛型,由于本人还没有熟练掌握泛型,姑且放之 * * * 捕获异常,看是否出现了格式错误,因为一般出现了格式错误 * 这两条语句都会发生无法取得元素的错误 */ } /* * 启动按钮的事件 */ public void b_start_ActionPerformed(ActionEvent e) { //判断存储两个标记的向量中是否为空 if (v_identNumber.size() <= 0 || v_name.size() <= 0) { l_information.setText("数据没有加载,请加载数据!"); } else { if (chooseTime >= 6) { JOptionPane.showMessageDialog(ChooseAward.this, "抽奖已经结束,请保存结果"); b_start.setText("开始"); l_identNumber.setText("抽奖结束..."); awardThread.changeflag_stop(); l_information.setText("抽奖结束,若要再进行一次须重新启动程序!"); b_start.setEnabled(false); b_stop.setEnabled(false); } else//执行.... { awardThread = new ChooseThread(this); awardThread.changeflag_start(); l_information.setText("将产生:一(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=""; if(chooseTime>6&&getLevel()>=10) { t_identNumber.setText((String)z_identNumber.elementAt(0)); } /* * 根据第几次来按停止按钮来决定是产生几等奖 */ 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); z_identNumber.removeElement(t_identNumber.getText()); //z_name.removeElement(t_identNumber.getText()); //z_name.removeElementAt(z_identNumber.indexOf(t_identNumber.getText())); break;//跳出循环 } } l_identNumber.setText("三等奖"); b_start.setText("继续"); //这是要输出到文本文件的信息 awardmessage = t_identNumber.getText() + str_name; //将要打印的文本信息先存放到一个可变向量中 v_printident.addElement("三等奖 " + awardmessage);//系统提示说要使用泛型,本人不会用,以后再研究 v_printident3.addElement(awardmessage); message = "第"+chooseTime+"位三等奖得主为: "+str_name; l_jieguo_three.setText(v_printident3.toString()); 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); z_identNumber.removeElement(t_identNumber.getText()); //z_name.removeElement(t_identNumber.getText()); //z_name.removeElementAt(z_identNumber.indexOf(t_identNumber.getText())); break; } } l_identNumber.setText("二等奖"); awardmessage = t_identNumber.getText() + str_name; v_printident.addElement("二等奖 " + awardmessage); v_printident2.addElement(awardmessage); int serial=chooseTime-3;//第几位得主,排名序号 message = "第"+serial+"位二等奖得主为: "+str_name; l_jieguo_two.setText(v_printident2.toString()); 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); z_identNumber.removeElement(t_identNumber.getText()); //z_name.removeElementAt(z_identNumber.indexOf(t_identNumber.getText())); break; } } l_identNumber.setText("一等奖"); awardmessage = t_identNumber.getText() + str_name; v_printident.addElement("一等奖 " + awardmessage); v_printident1.addElement(awardmessage); /* * 第几位得主,排名序号,其实没必要这样写,因为本来就这一名 * 现在这样写的作用是为我以后改进这个程序(可以自主选择产生几名得奖主) * 的时候做好准备 */ //serial=chooseTime-5; //message = "第"+serial+"位二等奖得主为: "+str_name; message = "一等奖得主为: "+str_name; l_jieguo_one.setText(v_printident1.toString()); JOptionPane.showMessageDialog(ChooseAward.this, message); t_identNumber.setText("");//设置文本为空 l_information.setText("此次抽奖全部结束,保存抽奖结果!"); 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); // z_identNumber.removeElement(t_identNumber.getText()); // //z_name.removeElement(t_identNumber.getText()); // //z_name.removeElementAt(z_identNumber.indexOf(t_identNumber.getText())); // break; // } // } // l_identNumber.setText("特等奖"); // awardmessage = "特等奖" + t_identNumber.getText() + str_name + "/r/n"; // v_printident.addElement(awardmessage); // message = "特等奖得主为: "+str_name; // JOptionPane.showMessageDialog(ChooseAward.this, message); // 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<String> 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 Dimension getScreenSize() { return Toolkit.getDefaultToolkit().getScreenSize(); } /* * 程序的入口 */ public static void main(String[] args) { //根据经验,这条语句只能在第一行 JFrame.setDefaultLookAndFeelDecorated(true); ChooseAward award = new ChooseAward(); award.setBackground(Color.red); award.setLocationRelativeTo(null);//居中显示 award.setVisible(true); award.setAlwaysOnTop(true);//置顶 award.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static int getLevel() { return level; } public static void setLevel(int level) { ChooseAward.level = level; } } //所有组件都在contentPane上面