朋友選課犯了難,我說不如給你寫個抓鬮程序吧,看天意,可以啊,於是說幹就幹。以下是源碼,供參考:
public class SelectClass extends JFrame {
private static final long serialVersionUID = 1L;
JPanel pn1 = null;
JPanel pn2;
JPanel pn3;
JTextArea tf = null;
JLabel msg = null;
JButton btn1;
JButton btn2;
JButton btn3;
boolean flag = true;
// 在構造器中,初始化界面
public SelectClass() {
tf = new JTextArea(2, 40);
pn1 = new JPanel();
// 組件放在面板上
pn1.add(tf);
this.add(pn1, BorderLayout.NORTH);
msg = new JLabel(" 心誠則靈!");
msg.setForeground(Color.red);
msg.setFont(new Font("楷體", Font.PLAIN, 80));
pn2 = new JPanel();
pn2.add(msg);
// 面板放在窗體上
this.add(pn2, BorderLayout.CENTER);
// 底部的按鈕部分
btn1 = new JButton("開始");
btn3 = new JButton("自動");
// 給開始按鈕加入事件
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
/*
* 必須使用多線程技術,重新啓動一個新的線程,去賦值flag 接着調用chouJiang(), 纔可以是程序恢復響應。
*/
class ThreadStart extends Thread {
@Override
public void run() {
// 在這裏去調用抽獎方法
flag = true;
chouJiang();
}
}
// 必須將上面的線程內部類,實例化,之後啓動
new ThreadStart().start();
}
});
btn2 = new JButton("停止");
// 給停止按鈕添加事件監聽
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 必須啓動一個新的停止線程,才能終止無限循環
class ThreadStop extends Thread {
@Override
public void run() {
flag = false;
}
}
// 啓動上面的內部類線程
new ThreadStop().start();
}
});
btn3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chouJiang2();
}
});
pn3 = new JPanel();
pn3.add(btn1);
pn3.add(btn2);
pn3.add(btn3);
this.add(pn3, BorderLayout.SOUTH);
// 設置窗口的屬性
this.setTitle("聽天由命===>");
this.setIconImage(getIconImage());
this.setSize(500, 300);
this.setLocation(500, 280);
// JFrame默認的關閉按鈕,只是隱藏窗口,需要重寫設計關閉功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
// 對於一個複雜的任務,首先想到的是封裝方法
public void chouJiang() {
String text = ""; // 顯示在文本框中
int i = 0;
String[] arr = { "廣告學(會展管理方向)", "法學", "社會學", "對外漢語(公關禮儀)", "廣告作品分析", "藝術設計", "藝術設計(多媒體設計與製作)", "廣播電視編導",
"影視作品分析", "影視動畫作品分析", "工商管理", "會計學", "國際經濟與貿易", "行政管理" };
while (flag) {
text = "";
i = (int) Math.floor(Math.random() * arr.length + 1) - 1;
System.out.println(i);
text = arr[i];
try {
Thread.sleep(35);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 顯示在文本框中
tf.setText(text);
tf.setFont(new Font("楷體", Font.PLAIN, 20));
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public <T> void chouJiang2() {
String[] arr = { "廣告學(會展管理方向)", "法學", "社會學", "對外漢語(公關禮儀)", "廣告作品分析", "藝術設計", "藝術設計(多媒體設計與製作)", "廣播電視編導",
"影視作品分析", "影視動畫作品分析", "工商管理", "會計學", "國際經濟與貿易", "行政管理" };
TreeMap map = new TreeMap();// key存放的是數字,value存放的是數字出現的次數
String text = "";
for (int i = 0; i < 100000; i++) {
System.out.println("---" + i);
text = "";
int j = (int) Math.floor(Math.random() * arr.length + 1) - 1;
text = arr[j];
// 如果數字第一次生成,key就賦值爲該數字,value賦值爲1
if (map.get(text) == null) {
map.put(text, new Integer(1));
// 否則,數字多次出現,key仍賦值爲該數字,但是value應在原有的次數上增加一次。
} else {
int value = ((Integer) (map.get(text))).intValue();
map.put(text, new Integer(value + 1));
}
}
Collection<Integer> c = map.values();
Iterator<? extends Integer> i = (Iterator<? extends Integer>) c.iterator();
Integer candidate = i.next();
while (i.hasNext()) {
Integer next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
int max = candidate;// 統計出現次數最多的數字次數
System.out.println("--------" + max);
ArrayList list = new ArrayList();// 存放出現次數最多的數字
Set set = map.entrySet();
// 統計每個數字出現的次數
for (Iterator it = set.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
String key = entry.getKey().toString();
int value = ((Integer) entry.getValue()).intValue();
if (value == max) {
list.add(key);
}
System.out.println(key + " appeared " + value + " times");
}
System.out.println(list);
// 顯示在文本框中
tf.setText(" 隨機抽取100000次" + "\n" + " 出現最多的是" + list.get(0) + ",共" + max + "次");
tf.setFont(new Font("楷體", Font.PLAIN, 16));
}
public static void main(String[] args) {
new SelectClass();
}
}