在很多場合都會用到抽籤功能,傳統的有用竹筷子上面寫數字放入籤筒裡來取得,還有用紙張寫數字折起來來取出需求數字,不過這些方法都可能會有人為的干擾,最好的方式還是交由程式來取得亂數,當做抽籤結果,以求公平。
這個範例是利用Java亂數來製作的一個抽籤程式,可以選擇是否取數時可允許重覆的數值取得。畫面如下:
程式碼如下:
package rndApp; import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Toolkit; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.JList; import javax.swing.JTextField; import java.awt.Font; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JCheckBox; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.JFormattedTextField; import javax.swing.SwingConstants; public class RndFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JScrollPane jScrollPane = null; private JTextArea jTextArea = null; private JList jList = null; private JTextField rndText = null; private JButton jButton = null; private JButton jButton1 = null; private JLabel jLabel = null; private JCheckBox jCheckBox = null; private JFormattedTextField jFormattedTextField = null; // 最大數 private int maxNum = 50; // 是否重新取數 private boolean reRnd = false; // 目前取到的數count private int count = 0; // 存放值 private int[] Num = null; // 亂數種子 private java.util.Random r = new java.util.Random(); // @jve:decl-index=0: private JLabel jLabel1 = null; private JLabel jLabel2 = null; private JLabel label_max = null; private JLabel jLabel4 = null; private JLabel label_rernd = null; private JButton jButton2 = null; /** * This is the default constructor */ public RndFrame() { super(); initialize(); } private void setMaxNum(int maxNum) { this.maxNum = maxNum; } private void setReRnd(boolean b) { this.reRnd = b; } private void initNum() { count = 0; Num = new int[maxNum]; for (int i = 0; i < maxNum; i++) { Num[i] = i + 1; } } public void setRndText() { if (maxNum - count > 0) { int rnd = r.nextInt(maxNum - count); String str = String.valueOf(Num[rnd]); this.getRndText().setText(str); this.getJTextArea().append(str + "\n"); if (reRnd == false) { // 如果是不能重覆的話,那把值跟最後一個最交換, // 然後設定count++不再取到它 int tmp = Num[rnd]; Num[rnd] = Num[maxNum - 1 - count]; Num[maxNum - 1 - count] = tmp; count++; } } } public void setReset() { this.setMaxNum(Integer .parseInt(this.getJFormattedTextField().getText())); initNum(); this.setReRnd(this.jCheckBox.isSelected()); // 元件回復狀況 this.getJTextArea().setText(""); this.label_max.setText(this.getJFormattedTextField().getText()); this.label_rernd.setText(this.jCheckBox.isSelected() == true ? "是" : "否"); } /** * This method initializes this * * @return void */ private void initialize() { initNum(); this.setSize(400, 300); this.setName("jFrame"); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setContentPane(getJContentPane()); this.setTitle("抽籤程式"); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation(screenSize.width / 2 - this.getWidth() / 2, screenSize.height / 2 - this.getHeight() / 2); this.setVisible(true); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { label_rernd = new JLabel(); label_rernd.setBounds(new Rectangle(58, 50, 45, 18)); label_rernd.setHorizontalTextPosition(SwingConstants.TRAILING); label_rernd.setHorizontalAlignment(SwingConstants.CENTER); label_rernd.setText("否"); jLabel4 = new JLabel(); jLabel4.setBounds(new Rectangle(3, 50, 55, 18)); jLabel4.setText("重覆取數"); label_max = new JLabel(); label_max.setBounds(new Rectangle(58, 30, 44, 16)); label_max.setHorizontalAlignment(SwingConstants.CENTER); label_max.setText("50"); jLabel2 = new JLabel(); jLabel2.setBounds(new Rectangle(2, 30, 60, 16)); jLabel2.setText("最大人數"); jLabel1 = new JLabel(); jLabel1.setBounds(new Rectangle(2, 10, 68, 16)); jLabel1.setText("目前設定值"); jLabel = new JLabel(); jLabel.setBounds(new Rectangle(18, 123, 127, 33)); jLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); jLabel.setFont(new Font("Dialog", Font.BOLD, 24)); jLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); jLabel.setText("最大人數:"); jContentPane = new JPanel(); jContentPane.setLayout(null); // jContentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, // 0)); jContentPane.add(getJScrollPane(), null); jContentPane.add(getJList(), null); jContentPane.add(getRndText(), null); jContentPane.add(getJButton(), null); jContentPane.add(getJButton1(), null); jContentPane.add(jLabel, null); jContentPane.add(getJCheckBox(), null); jContentPane.add(getJFormattedTextField(), null); jContentPane.add(jLabel1, null); jContentPane.add(jLabel2, null); jContentPane.add(label_max, null); jContentPane.add(jLabel4, null); jContentPane.add(label_rernd, null); jContentPane.add(getJButton2(), null); } return jContentPane; } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setBounds(new Rectangle(308, 2, 82, 264)); jScrollPane.setViewportView(getJTextArea()); } return jScrollPane; } /** * This method initializes jTextArea * * @return javax.swing.JTextArea */ private JTextArea getJTextArea() { if (jTextArea == null) { jTextArea = new JTextArea(); } return jTextArea; } /** * This method initializes jList * * @return javax.swing.JList */ private JList getJList() { if (jList == null) { jList = new JList(); jList.setBounds(new Rectangle(5, 101, 302, 8)); } return jList; } /** * This method initializes rndText * * @return javax.swing.JTextField */ private JTextField getRndText() { if (rndText == null) { rndText = new JTextField(); rndText.setBounds(new Rectangle(103, 8, 112, 88)); rndText.setFont(new Font("Dialog", Font.PLAIN, 66)); rndText.setHorizontalAlignment(JTextField.CENTER); rndText.setText(""); } return rndText; } /** * This method initializes jButton * * @return javax.swing.JButton */ private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(215, 64, 90, 32)); jButton.setText("取數"); jButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { RndFrame frame = ((RndFrame) ((JButton) e.getSource()) .getTopLevelAncestor()); frame.setRndText(); } }); } return jButton; } /** * This method initializes jButton1 * * @return javax.swing.JButton */ private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(57, 193, 90, 35)); jButton1.setText("設定"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { RndFrame frame = ((RndFrame) ((JButton) e.getSource()) .getTopLevelAncestor()); frame.setReset(); } }); } return jButton1; } /** * This method initializes jCheckBox * * @return javax.swing.JCheckBox */ private JCheckBox getJCheckBox() { if (jCheckBox == null) { jCheckBox = new JCheckBox(); jCheckBox.setBounds(new Rectangle(18, 159, 237, 30)); jCheckBox.setFont(new Font("Dialog", Font.BOLD, 24)); jCheckBox.setText("是否可以重覆取數"); } return jCheckBox; } /** * This method initializes jFormattedTextField * * @return javax.swing.JFormattedTextField */ private JFormattedTextField getJFormattedTextField() { if (jFormattedTextField == null) { javax.swing.text.NumberFormatter mf2 = null; mf2 = new javax.swing.text.NumberFormatter(); mf2.setMaximum(new Integer(500)); mf2.setMinimum(new Integer(0)); jFormattedTextField = new JFormattedTextField(mf2); jFormattedTextField.setBounds(new Rectangle(151, 123, 119, 33)); jFormattedTextField.setHorizontalAlignment(JTextField.CENTER); jFormattedTextField.setText("50"); jFormattedTextField.setFont(new Font("Dialog", Font.PLAIN, 24)); } return jFormattedTextField; } /** * This method initializes jButton2 * * @return javax.swing.JButton */ private JButton getJButton2() { if (jButton2 == null) { jButton2 = new JButton(); jButton2.setBounds(new Rectangle(229, 237, 76, 24)); jButton2.setText("關於"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { RndFrame frame = ((RndFrame) ((JButton) e.getSource()) .getTopLevelAncestor()); javax.swing.JOptionPane.showMessageDialog(frame, "blog.yslifes.com\r\nPower by yku"); } }); } return jButton2; } public static void main(String[] args) { new RndFrame(); } } // @jve:decl-index=0:visual-constraint="10,10"
Jar Run程式,可直接執行
用法說明:
下方可設定取數的範圍為1到某個數中間(最大人數),取數過程是否可取到重覆的數字,選擇好後按下”設定”按鈕可以看到左上角設定值已被更改,再來按下按鈕”取數”可於中間TextField看到取到的數字為何,而右側會顯示歷史記錄。
ps.其實這程式的亂數還有很大的改進空間,有興趣的朋友可以自己再做些修改。
不好意思~最近剛好需要抽籤產生器
我下載了RndApp.zip
但是裡面找不到可以開始的程式
請問是需要安裝什麼軟體才能開啓嗎??
謝謝你的回覆!!
要先安裝jdk喔…
然後雙擊.jar檔就可以了
@yku, 真的是非常謝謝你^^
大大你好 想要學習大大的程式教學 我用netbeans 要像你這樣跑出一個軟體來要怎用 然後圖形怎用進去阿 謝謝你的回覆!!
站長好:
由於我也是沒出現該出現的抽籤程式
故請教站長
我的作業系統是win7+64位元
同時下載站長的RndApp.jar、Random1.2.jar (安裝在C槽內的默認位置)
https://skydrive.live.com/?cid=0c2a0afafc5ad85d&id=C2A0AFAFC5AD85D!782&authkey=!
然後也去下載了JDK (版本:Windows x64) (放置在C槽內的新開資料夾)
http://www.oracle.com/technetwork/java/javase/downloads/index.html
以上兩件事情都完成了 也重新開機了
但就是點了.jar檔 卻都會跑進去資料夾內
(照道理說應該要執行抽籤程式的)
請問不知道站長這是為什麼呢?!
你的解壓縮程式有設定副檔名.jar的開啟是由解壓縮程式開啟的
1.你可以解除解壓縮程式的關連
2.或你可以在command指令下java -jar RndApp.jar
站長好:
先感謝站長的回覆呢。
關於站長所說的第一點:
嗯~其實我也不是很懂這些,
不確定站長所指的”解除解壓縮程式的關連”是不是如圖
不過好像一開始就沒注意有無此設定
所以我只好沒做任何動作了(好像也找不到副檔名.jar的勾選)
補圖:系統自行預設開啟RndApp.jar的模式
(本來只有Windows檔案總管..其他2個是被我亂玩錯誤也沒反應低)
第二點呢:
我…我我實在不懂阿ㄚㄚ….
其實我在”開始”或”執行”輸入「command」
→出現不相關的東西或是Windows找不到command(跳出視窗)
然後或在”開始”及”執行”輸入「cjava -jar RndApp.jar」
→跳出某個視窗,然後快速的自我關閉(我完全看不清楚它的畫面)
PS.好像要玩某些東西,須先設定某種環境;
會不會是因為我根本就沒設定相關環境的關係呢?!
(很久之前有上類Java的一堂課,一開始老師有先設定電腦環境….故所產生的聯想)
PS2.原諒我滴無知…汗
@月牙兒,
我先讓你可以執行
你在開始->附屬應用程式->命令提示字元
然後
cd 你的RndApp.jar目錄
然後
java -jar RndApp.jar
由於上一個留言,不支援語法貼圖,
故再次奉上連結.(圖片是上傳免費貼圖空間-ImageShack)
關於站長所說的第一點:
http://imageshack.us/scaled/landing/855/v16c.jpg
補圖:
http://imageshack.us/scaled/landing/837/ee4h.jpg
站長好:
人家依照站長的指示~
‧開始->附屬應用程式->命令提示字元→這一切順利押
‧我先輸入”cd”(按Enter)(只輸入””以內的字)
然後再輸入”C:\Program Files Up\RndApp”(按Enter)(只輸入””以內的字)
(因為放在這C:\Program Files Up\RndApp\RndApp.jar.zip)
但,它就顯示「’C:\Program’ 不是內部或外部令命、可執行的程式或批次檔)」呢
唔…若改放在C:\Program Files或C:\Program Files(x86)也是會出現上面「」內滴字耶@@”
@月牙兒,
1.建意你不要放在有空的路徑的位置
2.或是你可以用cd “C:\Program Files Up\RndApp”
需要加雙引號
也可以
站長好:
唔…照上一次站長回覆的指令2
(輸入「”C:\Program Files Up\RndApp”」->「」內已全部輸入)
好像依舊會出現「’C:\Program’ 不是內部或外部令命、可執行的程式或批次檔)」
至於站長的指令1:「1.建意你不要放在有空的路徑的位置」
我我我…我不太了解這是甚麼意思耶?
嗯…或許人家重新開始再來一次看看”
1.首先在C槽新增資料夾(Program Files xyz) 並放入RndApp.jar、RndApp
由於不確定何者該解壓縮 何者不用解(以及主、副關係)
所以放置了三個資料夾(RndApp1、RndApp2、RndApp3)
C槽:C:\Program Files xyz\RndApp\RndApp1 (2個都是壓縮檔)
C槽:C:\Program Files xyz\RndApp\RndApp2 (RndApp.jar解壓縮、RndApp不解壓縮)
C槽:C:\Program Files xyz\RndApp\RndApp3 (RndApp解壓縮、RndApp.jar不解壓縮)
附上截圖 再請至站長查看是否有錯誤呢
圖址(ImageShack®):http://imageshack.us/a/img819/656/sc3u.jpg
2.安裝jdk-7u15-windows-x64
默認安裝於C槽的資料夾(Program Files)
(與RndApp放置為不同資料夾)
3.噗~然後好像三種(資料夾)都失敗….
我都只點選三個資料夾內的”log4j-1.2.16″
因為它最像應該是抽籤程式的圖示
再請勞煩站長查看是否我有哪裡做錯誤呢?!
因為之前有安裝一個漫畫軟體(它也需額外安裝某JAVA)
最後有成功開始並使用(不過搞了很久就是了)
所以覺得抽籤程式應該也是可以使用的耶
@月牙兒,
你把檔案放d:\
再來執行