1. 支持图形界面。 2. 支持通过文件对话框选取文件,从文件中读取抽奖名单。 3. 支持设置一、二、三等奖个数。 4. 抽奖过程人名快速轮换,后逐渐减慢至停止。 5. 支持保存抽奖结果至文件。
Award.java
package bag6;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
class Draw implements ActionListener{
boolean ifStart = true;
ArrayList<String> arrayList = new ArrayList<>(); //定义一个字符串链表
File file = new File("winner"); //中奖名单
private JFrame jFrame; //定义一个主窗口
private JPanel jPanel1,jPanel2,jPanel3; //定义面板
private JTextField jTextField1,jTextField2; //定义两个个文本框(用于显示抽奖姓名,和抽中人数设计)
private JLabel jLabel1,jLabel2; //定义姓名,和人数标签
private JTextArea jTextArea; //定义一个文本区方便查看中奖名单
private JComboBox jComboBox; //定义一个下拉列表(一,二,三等奖)
private JButton jButton1,jButton2,jButton3; //定义三个按钮(导入名单,开始抽奖,中奖名单)
private JToggleButton jToggleButton;
//构造函数
public Draw(){
jFrame = new JFrame("抽奖小程序");
jPanel1 = new JPanel();
jPanel2 = new JPanel();
jPanel3 = new JPanel();
jLabel1 = new JLabel("姓名");
jTextField1 = new JTextField(10);
jTextField1.setPreferredSize(new Dimension(200,80));
jTextField1.setBackground(null);
jTextField1.setOpaque(false); //去掉边框线
jTextField1.setFont(new Font("宋体",Font.ITALIC,20)); //设计字体大小
jTextField1.setBorder(null); //设计透明
jTextField1.setEditable(false); //姓名文本框不能编辑
jLabel2 = new JLabel("人数");
jTextField2 = new JTextField("3",2);
jTextArea = new JTextArea();
jComboBox = new JComboBox();
jComboBox.addItem("一等奖");
jComboBox.addItem("二等奖");
jComboBox.addItem("三等奖");
jButton1 = new JButton("导入名单");
jButton2 = new JButton("开始抽奖");
jButton3 = new JButton("中奖名单");
//jToggleButton = new JToggleButton("开始抽奖");
//设计布局
jFrame.setLayout(new GridLayout(3,1)); //m行n列
jPanel1.add(jLabel1);
jPanel1.add(jTextField1);
jPanel1.add(jButton2); //第一块面板放(姓名标签,文本框,开始抽奖按钮)
jPanel2.add(jComboBox);
jPanel2.add(jLabel2);
jPanel2.add(jTextField2); //第二块面板放(下拉列表,人数标签,文本框)
jPanel3.add(jButton1);
jPanel3.add(jButton3); //第三块面板放(导入名单按钮,和中奖名单按钮)
//将面板放进窗口
jFrame.add(jPanel1);
jFrame.add(jPanel2);
jFrame.add(jPanel3);
//设计显示
jFrame.setSize(600,300);
jFrame.setLocation(600,200);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
//接收监听
addListener();
}
private void addListener(){
jButton1.addActionListener(this);
jButton2.addActionListener(this);
jButton3.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
Object object = e.getSource();
if(object == jButton1){
fileOpen(); //导入文件
}
if(object == jButton2){
ifStart = true; //标志开始
new Thread(new Runnable() {
@Override
public void run() {
int time = 250; //设置一个抽奖时长
int i = 25; //设置一个开始sleep时长
int j = Integer.parseInt(jTextField2.getText()); //把文本框2的内容转换为int型,用来抽奖
while(j>0) { //人数大于0
i = 25;
while (true) {
try {
if (!ifStart) {
synchronized (this) {
this.wait();
}
}
Random random = new Random();
if (arrayList.size() == 0) { //用于判断是否有名单在链表中
break;
}
int rd = random.nextInt(arrayList.size());
jTextField1.setText(arrayList.get(rd)); //将随机产生的数当作链表的下标
if (i < time) {
Thread.sleep(i);
i += 25;
} else {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//把文本框1的内容写进winner.txt中
try {
if (!file.exists()) {
file.createNewFile();
}
String name = jTextField1.getText();
if (name.trim().length() != 0 && arrayList.contains(name)) {
String price = (String) jComboBox.getSelectedItem(); //获取当前数据项
FileWriter fileWriter = new FileWriter(file, true);
fileWriter.write(name + " " + price);
fileWriter.write("\r\n");
fileWriter.close();
Thread.sleep(2000);
}
arrayList.remove(name);
} catch (IOException e3) {
System.out.println(e3);
}catch (InterruptedException e2){
e2.printStackTrace();
}
j--;
}
}
}).start();
}
if(object == jButton3){ //显示winner.txt中的内容,并创建一个窗口显示名单
JFrame jFrame = new JFrame();
JTextArea jTextArea = new JTextArea();
jTextArea.setEditable(false);
JScrollPane jScrollPane = new JScrollPane(jTextArea);
jFrame.add(jScrollPane,BorderLayout.CENTER);
jFrame.setTitle("中奖名单");
jFrame.setSize(300,350);
jFrame.setVisible(true);
jFrame.setLocation(250,200);
try{
FileReader inOne = new FileReader(file);
BufferedReader inTwo = new BufferedReader(inOne);
String s = null;
while((s = inTwo.readLine())!=null){
s = s.trim();
jTextArea.append(s + '\n');
}
}catch (IOException e1){
System.out.println(e1);
}
}
}
private void fileOpen(){
//FileDialog和JFileChooser两个都行,喜欢那个窗口就用那个就行
/*FileDialog fileDialog = new FileDialog(new Frame(),"默认打开目录",FileDialog.LOAD);
fileDialog.setVisible(true);
File [] file = fileDialog.getFiles();*/
JFileChooser jFileChooser = new JFileChooser(new File("C:"));
FileNameExtensionFilter filter = new FileNameExtensionFilter("txt", "txt");
jFileChooser.setFileFilter(filter);
jFileChooser.setMultiSelectionEnabled(true);
jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
jFileChooser.showDialog(jFileChooser,"确定");
File[] file = jFileChooser.getSelectedFiles();
for(File s:file){
System.out.println(s);
}
//读取listname文件内进arrayList中
try{
FileReader inOne = new FileReader(file[0]);
BufferedReader inTwo = new BufferedReader(inOne);
String name = null;
while((name = inTwo.readLine()) != null){
name = name.trim();
arrayList.add(name);
}
}catch (IOException e){
System.out.println(e);
}
}
}
public class Award {
public static void main(String []args){
Draw draw = new Draw();
}
}
1.程序运行前准备一份txt的文件,里面是一份名字文档。一行一个名字.例如
2.运行程序
3.导入文件(点击导入名单,找到刚才的文件,我的是放在桌面)
4。可以改变(一二三等奖,和抽中人数)
5.点击中奖名单(查看结果)中奖者名单(winner.txt)是建立在和项目同一个目录下了。