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

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

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

          *   本程序的數據來源選用的是文本文件,原因有,第一,這是一個小程序,加上數據庫顯得不適宜。第二,本著
          *   學習的態度,因為,如果用數據庫來實現的話,很多功能都可以通過sql語句和 數據庫的功能來實現。而此程序
          *   所有的功能都需程序本身來承擔完成。當然,對于有大量的數據來說,還是需要數據庫的。像這樣把數據一次性
          *   讀入內存中,大于大量數據是不行的!

          *   此程序是在無界面設計的環境eclipse下設計完成的,界面難免顯得僵硬....

          *   在以后的版本中還將實現,用戶可以自己設定 名額,獎項等....
          */
          package youg;
          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("退出")
                  };
                  private JMenuItem[] filew={new JMenuItem("關于我們")};
                 
                  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("系統信息:");

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

                  //選擇隨機數的線成
                  public ChooseThread awardThread = null;
                  public static int level=1;
                  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);
                                  }
                          });
                          //加入相關信息
                          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<filew.length;i++)
                          {
                                  aboutMenu.add(filew[i]);
                                  //加入分隔線,為了美觀
                                  //aboutMenu.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 about_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
                                                  {
                                                  z_identNumber.add(k, v.elementAt(0));
                                                  z_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();   // 輸出出錯信息
                                  }
                          }
                          String a=(String)z_name.lastElement();
                          level=new Integer(a); //設定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)
                  {
                          //判斷存儲兩個標記的向量中是否為空
                          if (v_identNumber.size() <= 0 || v_name.size() <= 0)
                          {
                                  l_information.setText("數據沒有加載,請加載數據!");
                          }
                          else
                          {
                                  if (chooseTime > 6)
                                  {
                                          l_information.setText("抽獎結束,若要再進行一次須重新啟動程序!");
                                          b_start.setEnabled(false);
                                          b_stop.setEnabled(false);
                                         
                                  }
                                  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="";
                          if(chooseTime>6&&level>=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 + "\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);
                                                  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);
                                  /*
                                   * 第幾位得主,排名序號,其實沒必要這樣寫,因為本來就這一名
                                   * 現在這樣寫的作用是為我以后改進這個程序(可以自主選擇產生幾名得獎主)
                                   * 的時候做好準備
                                   */
                                  //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("此次抽獎全部結束,保存抽獎結果!");
                                  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);
                  }
          }

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

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


          網站導航:
           
          主站蜘蛛池模板: 广河县| 神池县| 拜泉县| 揭阳市| 乐平市| 稻城县| 仁寿县| 呼和浩特市| 天水市| 泗洪县| 南岸区| 广州市| 佛坪县| 公安县| 井冈山市| 卫辉市| 辽阳市| 阜新市| 廉江市| 上饶县| 冀州市| 沙坪坝区| 汾阳市| 当阳市| 兴海县| 嘉兴市| 遵义县| 突泉县| 东阿县| 武威市| 乐亭县| 灵璧县| 金门县| 大田县| 安图县| 合水县| 金阳县| 图们市| 临江市| 陇西县| 龙山县|