隨筆-4  評論-4  文章-0  trackbacks-0

          /*
          *此小程序的基本流程是,在一個文本文件存放里面?zhèn)溥x的數(shù)據(jù),數(shù)據(jù)的格式是每行有姓名 和 手機(jī)號
          *他們之間是用分隔符-來分隔的。然后在自定義一個方法,通過分隔符來區(qū)分姓名和手機(jī)號,然后將
          *他們分別存儲進(jìn)兩個不同的可變向量當(dāng)中。
          *   自定義一個線程,此線程是專門用來隨機(jī)選取一個號碼, 并且每隔50毫秒就將一個不同的號碼顯示在
          *   號碼框中,這樣就實(shí)現(xiàn)了號碼的快速滾動,實(shí)現(xiàn)了完全模擬電視當(dāng)中抽獎的畫面

          *   為了實(shí)現(xiàn)選取出的一個號碼不能再被選種,實(shí)現(xiàn)的方法是將他們從可變向量中清除出去

          *   本程序的數(shù)據(jù)來源選用的是文本文件,原因有,第一,這是一個小程序,加上數(shù)據(jù)庫顯得不適宜。第二,本著
          *   學(xué)習(xí)的態(tài)度,因?yàn)椋绻脭?shù)據(jù)庫來實(shí)現(xiàn)的話,很多功能都可以通過sql語句和 數(shù)據(jù)庫的功能來實(shí)現(xiàn)。而此程序
          *   所有的功能都需程序本身來承擔(dān)完成。當(dāng)然,對于有大量的數(shù)據(jù)來說,還是需要數(shù)據(jù)庫的。像這樣把數(shù)據(jù)一次性
          *   讀入內(nèi)存中,大于大量數(shù)據(jù)是不行的!

          *   此程序是在無界面設(shè)計(jì)的環(huán)境eclipse下設(shè)計(jì)完成的,界面難免顯得僵硬....

          *   在以后的版本中還將實(shí)現(xiàn),用戶可以自己設(shè)定 名額,獎項(xiàng)等....
          */
          package youg;
          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import java.io.*;
          import java.util.*;

          public class ChooseAward extends JFrame
          {
                  /**
                   *
                   */
                  //系統(tǒng)自動生成
                  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();
                 
                  //菜單項(xiàng)
                  JMenu fileMenu=new JMenu("文件");
                  JMenu setMenu=new JMenu("設(shè)置");
                  JMenu aboutMenu=new JMenu("關(guān)于");
                 
                  /*
                   * 菜單子項(xiàng)
                   */
                  private JMenuItem[] filem={new JMenuItem("選擇文件"),new JMenuItem("另存為.."),
                                  new JMenuItem("保存"),new JMenuItem("退出")
                  };
                  private JMenuItem[] filew={new JMenuItem("關(guān)于我們")};
                 
                  JTextField t_identNumber = new JTextField(); // 身份證號的文本域

                  Vector v_identNumber = new Vector(); // 存放讀取出來的號碼

                  Vector v_name = new Vector(); // 存放讀取出來的人的姓名
                 
                  Vector z_identNumber = new Vector(); // 存放號碼

                  Vector z_name = new Vector(); // 存放姓名

                  Vector v_printident = new Vector(); // 存放中獎人的身份證號碼

                  JLabel l_information = new JLabel();

                  JLabel l_identNumber = new JLabel();

                  JLabel l_sysinformation = new JLabel("系統(tǒng)信息:");

                  JFileChooser filechooser = new JFileChooser(); // 文件選擇器

                  //選擇隨機(jī)數(shù)的線成
                  public ChooseThread awardThread = null;
                  public static int level=1;
                  int chooseTime = 0; // 按下停止按鈕的次數(shù),也就是抽獎的次數(shù)
                  public ChooseAward()
                  {
                          super("**抽獎系統(tǒng)");
                          t_identNumber.setEditable(false);
                          /*
                           * 1.4以后的JDK可以不用Container
                           */
                          Container contentPane = getContentPane();
                          //BorderLayout布局管理器,東,南,西,北
                          contentPane.setLayout(new BorderLayout());
                          /*
                           * 給幾個按鈕和子菜單添加監(jiān)聽器
                           */
                          filem[0].addActionListener(new ActionListener()
                          {
                                  // 注冊加載事件的監(jiān)聽器
                                  public void actionPerformed(ActionEvent e)
                                  {
                                          b_loadident_ActionPerformed(e);
                                          }
                                  });
                          b_start.addActionListener(new ActionListener()
                          {         
                                  // 注冊開始事件的監(jiān)聽器
                                                  public void actionPerformed(ActionEvent e)
                                                  {
                                                          b_start_ActionPerformed(e);
                                                  }
                                          });
                          b_stop.addActionListener(new ActionListener()
                          {       // 注冊停止事件的監(jiān)聽器
                                                  public void actionPerformed(ActionEvent e)
                                                  {
                                                          b_stop_ActionPerformed(e);
                                                  }
                                          });
                          filem[2].addActionListener(new ActionListener()
                          {      // 注冊打印事件的監(jiān)聽器
                                                  public void actionPerformed(ActionEvent e)
                                                  {
                                                          b_printaward_ActionPerformed(e);
                                                  }
                                          });
                          addWindowListener(new WindowAdapter()
                          {
                                  public void windowClosing(WindowEvent e)
                                  {
                                          System.exit(0);
                                  }
                          });
                          //加入相關(guān)信息
                          filew[0].addActionListener(new ActionListener()
                                  {
                                          // 注冊加載事件的監(jiān)聽器
                                          public void actionPerformed(ActionEvent e)
                                          {
                                                  about_loadident_ActionPerformed(e);
                                                  }
                                          });
                         
                          //將菜單子項(xiàng)加入菜單中
                          for(int i=0;i<filem.length;i++)
                          {
                                  fileMenu.add(filem[i]);
                                  //加入分隔線,為了美觀
                                 
                                          fileMenu.addSeparator();
                          }
                         
                          for(int i=0;i<filew.length;i++)
                          {
                                  aboutMenu.add(filew[i]);
                                  //加入分隔線,為了美觀
                                  //aboutMenu.addSeparator();
                          }
                          //將菜單條加入frame中
                          menubar.add(fileMenu);
                          menubar.add(setMenu);
                          menubar.add(aboutMenu);
                          setJMenuBar(menubar);
                         
                         
                          /*將p_north設(shè)計(jì)為一個狀態(tài)欄,顯示一些操作過程中的信息
                           * 創(chuàng)建一個左對齊方式的流布局
                           */
                          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);
                          /*
                           * 設(shè)置的一些顯示方式,字體,大小等,為了盡量美觀一點(diǎn)
                           */
                          Font xuehao=new Font("null",Font.PLAIN,30);
                          l_identNumber.setFont(xuehao);
                          //字體的居中對齊
                          l_identNumber.setHorizontalAlignment(0);
                          l_identNumber.setText("手機(jī)號");
                         
                         
                          Font number=new Font("null",Font.BOLD,30);//粗體
                          t_identNumber.setFont(number);
                          //設(shè)置字體顏色
                          t_identNumber.setForeground(Color.red);
                          t_identNumber.setHorizontalAlignment(0);
                         
                         
                         
                          //給上面的jpanel設(shè)置布局
                          p_north.setLayout(new GridLayout(2,1));
                          p_north.add(l_identNumber);
                          p_north.add(t_identNumber);
                         
                         
                          contentPane.add(p_north,BorderLayout.NORTH);
                          //給中間的jpanel 設(shè)置布局
                          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;
                          //從字符輸入流中讀取文本,緩沖各個字符,從而提供字符、數(shù)組和行的高效讀取
                          BufferedReader reader = null;
                          //此方法會返回一個int值
                          int i = filechooser.showOpenDialog(this); // 顯示打開文件對話框
                          /*
                           * 確實(shí)所選擇的是對話框上的確定按鈕
                           */
                          if (i == JFileChooser.APPROVE_OPTION)
                          { // 點(diǎn)擊對話框中打開選項(xiàng)
                                  File f = filechooser.getSelectedFile(); // 得到所選擇的文件
                                  try
                                  {
                                          l_information.setText("數(shù)據(jù)加載中,請稍等...");
                                          //讀取字符流
                                          reader = new BufferedReader(new FileReader(f));
                                          //循環(huán)讀取
                                          while (true)
                                          {
                                                  //讀取一個文本行
                                                  String data = reader.readLine();
                                                  System.out.println(data);//開發(fā)時候測試用
          //                                        讀完了數(shù)據(jù)
                                                  if (data == null)
                                                  {
                                                      l_information.setText("數(shù)據(jù)加載完成!");
                                                      break;
                                                  }
                                                 
                                                  //通過“-”這個符號將 字符串分離為兩部分,再存放到向量里面
                                                  Vector v = this.apart(data, "-");
                                                  //System.out.println(data);//開發(fā)時候測試用
                                                  if (v == null)
                                                  {
                                                          l_information.setText("數(shù)據(jù)格式不正確,請重新加載!");
                                                          return;
                                                  }

                                                  /*
                                                   * 分別將分離開來的手機(jī)號碼,和姓名分別放入兩個可變向量當(dāng)中
                                                   * 這里應(yīng)該使用泛型,由于本人還沒有熟練掌握泛型,姑且放之
                                                   *
                                                   *
                                                   * 捕獲異常,看是否出現(xiàn)了格式錯誤,因?yàn)橐话愠霈F(xiàn)了格式錯誤
                                                   * 這兩條語句都會發(fā)生無法取得元素的錯誤
                                                   */
                                                  try
                                                  {
                                                  v_identNumber.add(k, v.elementAt(0));
                                                  v_name.add(k, v.elementAt(1));
                                                  k++;
                                                  }
                                                 
                                                  catch(Exception e4)
                                                  {
                                                          System.out.println("格式中沒有分隔符號出現(xiàn)的錯誤");
                                                          //JOptionPane.showMessageDialog(this, "導(dǎo)入的數(shù)據(jù)格式錯誤!");
                                                          l_information.setText("導(dǎo)入的數(shù)據(jù)格式錯誤!");
                                                          break;
                                                  }

                                          }
                                  } catch (Exception ex)
                                  {
                                          ex.printStackTrace(); // 輸出出錯信息
                                  }
                          }
                  }
                 
                 
                 
                 
                 
                  /*
                   * 加載關(guān)于按鈕的事件
                   */
                  public void about_loadident_ActionPerformed(ActionEvent e)
                  {
                          int k = 0;
                          chooseTime = 0;
                          //從字符輸入流中讀取文本,緩沖各個字符,從而提供字符、數(shù)組和行的高效讀取
                          BufferedReader reader = null;
                          //此方法會返回一個int值
                          int i = filechooser.showOpenDialog(this); // 顯示打開文件對話框
                          /*
                           * 確實(shí)所選擇的是對話框上的確定按鈕
                           */
                          if (i == JFileChooser.APPROVE_OPTION)
                          { // 點(diǎn)擊對話框中打開選項(xiàng)
                                  File f = filechooser.getSelectedFile(); // 得到所選擇的文件
                                  try
                                  {
                                          l_information.setText("數(shù)據(jù)加載中,請稍等...");
                                          //讀取字符流
                                          reader = new BufferedReader(new FileReader(f));
                                          //循環(huán)讀取
                                          while (true)
                                          {
                                                  //讀取一個文本行
                                                  String data = reader.readLine();
                                                  System.out.println(data);//開發(fā)時候測試用
          //                                        讀完了數(shù)據(jù)
                                                  if (data == null)
                                                  {
                                                      l_information.setText("數(shù)據(jù)加載完成!");
                                                      break;
                                                  }
                                                 
                                                  //通過“*”這個符號將 字符串分離為兩部分,再存放到向量里面
                                                  Vector v = this.apart(data, "*");
                                                  //System.out.println(data);//開發(fā)時候測試用
                                                  if (v == null)
                                                  {
                                                          l_information.setText("數(shù)據(jù)格式不正確,請重新加載!");
                                                          return;
                                                  }

                                                  /*
                                                   * 分別將分離開來的手機(jī)號碼,和姓名分別放入兩個可變向量當(dāng)中
                                                   * 這里應(yīng)該使用泛型,由于本人還沒有熟練掌握泛型,姑且放之
                                                   *
                                                   *
                                                   * 捕獲異常,看是否出現(xiàn)了格式錯誤,因?yàn)橐话愠霈F(xiàn)了格式錯誤
                                                   * 這兩條語句都會發(fā)生無法取得元素的錯誤
                                                   */
                                                  try
                                                  {
                                                  z_identNumber.add(k, v.elementAt(0));
                                                  z_name.add(k, v.elementAt(1));
                                                  k++;
                                                  }
                                                 
                                                  catch(Exception e4)
                                                  {
                                                          System.out.println("格式中沒有分隔符號出現(xiàn)的錯誤");
                                                          //JOptionPane.showMessageDialog(this, "導(dǎo)入的數(shù)據(jù)格式錯誤!");
                                                          l_information.setText("導(dǎo)入的數(shù)據(jù)格式錯誤!");
                                                          break;
                                                  }

                                          }
                                  } catch (Exception ex)
                                  {
                                          ex.printStackTrace();   // 輸出出錯信息
                                  }
                          }
                          String a=(String)z_name.lastElement();
                          level=new Integer(a); //設(shè)定LEVEL的取值
                          if(level<1||level>10)
                           level=5;
                          z_identNumber.remove(z_identNumber.lastElement());  //將最后一個去掉
                         
                          System.out.println("level"+level+z_identNumber.lastElement());
                  }

                 
                  /*
                   * 啟動按鈕的事件
                   */
                  public void b_start_ActionPerformed(ActionEvent e)
                  {
                          //判斷存儲兩個標(biāo)記的向量中是否為空
                          if (v_identNumber.size() <= 0 || v_name.size() <= 0)
                          {
                                  l_information.setText("數(shù)據(jù)沒有加載,請加載數(shù)據(jù)!");
                          }
                          else
                          {
                                  if (chooseTime > 6)
                                  {
                                          l_information.setText("抽獎結(jié)束,若要再進(jìn)行一次須重新啟動程序!");
                                          b_start.setEnabled(false);
                                          b_stop.setEnabled(false);
                                         
                                  }
                                  else//執(zhí)行....
                                  {
                                          awardThread = new ChooseThread(this);
                                          awardThread.changeflag_start();
                                          l_information.setText("將產(chǎn)生:特(1名),一(1名),二(2名),三(3名)等獎");
                                          l_identNumber.setText("選取中...");
                                          b_start.setEnabled(false);
                                          b_stop.setEnabled(true);
                                  }
                          }
                  }

                  /*
                   * 暫停按鈕的事件
                   */
                  public void b_stop_ActionPerformed(ActionEvent e)
                  {
                          //將跳轉(zhuǎn)的數(shù)字置于停止?fàn)顟B(tài)
                          awardThread.changeflag_stop();
                          String awardmessage = "";
                          chooseTime++;//第幾次按停止按鈕
                          String str_name = "";
                          String message="";
                          if(chooseTime>6&&level>=10)
                          {
                           t_identNumber.setText((String)z_identNumber.elementAt(0));
                          }
                          /*
                           * 根據(jù)第幾次來按停止按鈕來決定是產(chǎn)生幾等獎
                           */
                          switch (chooseTime)
                          {
                          case 1:
                          case 2:       
                          case 3://按前三次都是產(chǎn)生三等獎       
                                  //尋找停止在號碼框中的數(shù)字,是對應(yīng)的的存放號碼的向量中的第幾個
                                  for (int k = 0; k < v_identNumber.size(); k++)
                                  {
                                          //找到了對應(yīng)的號碼
                                          if ((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
                                          {
                                                  //取出這個號碼對應(yīng)的名字
                                                  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;//跳出循環(huán)
                                          }
                                  }
                                  l_identNumber.setText("三等獎");
                                  b_start.setText("繼續(xù)");
                                  //這是要輸出到文本文件的信息
                                  awardmessage = "三等獎  " + t_identNumber.getText() + str_name + "\r\n";
                                  //將要打印的文本信息先存放到一個可變向量中
                                  v_printident.addElement(awardmessage);//系統(tǒng)提示說要使用泛型,本人不會用,以后再研究
                                  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);
                                                  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);
                                  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);
                                                  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 + "\r\n";
                                  v_printident.addElement(awardmessage);
                                  /*
                                   * 第幾位得主,排名序號,其實(shí)沒必要這樣寫,因?yàn)楸緛砭瓦@一名
                                   * 現(xiàn)在這樣寫的作用是為我以后改進(jìn)這個程序(可以自主選擇產(chǎn)生幾名得獎主)
                                   * 的時候做好準(zhǔn)備
                                   */
                                  //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);
                                                  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);        
                                  l_information.setText("此次抽獎全部結(jié)束,保存抽獎結(jié)果!");
                                  break;
                          default:
                                  JOptionPane.showMessageDialog(ChooseAward.this, "抽獎已經(jīng)結(jié)束");
                                  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("文件輸出成功!保存在當(dāng)前目錄下..");
                          } catch (FileNotFoundException fe)
                          {
                                  System.err.println(fe);
                          } catch (IOException ioe)
                          {
                                  System.err.println(ioe);
                          }

                  }

                  /*
                   * 定義一個方法,將號碼和名字分離開來
                   */
                  //一個是源數(shù)據(jù)文件,一個是分隔符號
                  public Vector apart(String src, String separator)
                  {
                          //使用了泛型,用可變向量來存放等到的標(biāo)記
                          Vector<String> v = new Vector<String>();
                          /*
                           * string tokenizer 類允許應(yīng)用程序?qū)⒆址纸鉃闃?biāo)記,祥見api文檔
                           */
                          //src是源字符串,separator是把src分隔為幾段的標(biāo)記
                          StringTokenizer st = new StringTokenizer(src, separator);
                          //測試此 tokenizer 的字符串中是否還有更多的可用標(biāo)記
                          while (st.hasMoreTokens())
                          {
                                  //返回此 string tokenizer 的下一個標(biāo)記,并將它加入到可變向量中存放
                                  v.addElement(st.nextToken());
                          }
                          return v;//返回向量
                  }

                  /*
                   * 程序的入口
                   */
                  public static void main(String[] args)
                  {
                          //根據(jù)經(jīng)驗(yàn),這條語句只能在第一行
                          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);
                  }
          }

          posted on 2008-08-14 11:29 志遙 閱讀(373) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 曲松县| 舒城县| 旬邑县| 神池县| 太康县| 醴陵市| 万盛区| 佛山市| 甘德县| 于田县| 宁晋县| 西乌珠穆沁旗| 和政县| 湘西| 昌吉市| 广宁县| 文山县| 临颍县| 延寿县| 凤山市| 南阳市| 尚义县| 临湘市| 健康| 株洲市| 凉山| 沭阳县| 元朗区| 巫溪县| 喀什市| 汽车| 吉水县| 黎川县| 宜阳县| 永寿县| 庆城县| 惠水县| 洛川县| 丹寨县| 开封市| 南昌县|