import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class LotterySystem extends JFrame {
String values[] = {"131****1234", "132****5678", "181****4869", "131****4932", "175****1900"}; // 预设的抽奖号码数组
private final ThreadLocal<Thread> THREAD_LOCAL = new ThreadLocal<Thread>();// 存储当前线程中选中的号码
private final String START = "开始", STOP = "停止";// 按钮文本常量
private List<String> list;// 奖池,用于存储所有可以被抽中的号码
private Random random = new Random();// 生成随机数
private JLabel screen;// 显示当前抽中的号码的标签
public LotterySystem() {
setTitle("抽奖");//设置窗口标题
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(400, 400, 400, 200);//设置窗口位置、宽度和高度
list = new ArrayList<>(Arrays.asList(values));//将号码放入奖池
JPanel c = new JPanel();// 创建一个新的面板
c.setLayout(new BorderLayout());// 设置面板布局为边界布局
screen = new JLabel("请点击开始");// 创建一个标签,并设置初始文本
screen.setHorizontalAlignment(SwingConstants.CENTER);// 设置文本居中显示
screen.setFont(new Font("宋体", Font.PLAIN, 61));// 设置文本字体和大小
c.add(screen, BorderLayout.CENTER);// 将标签添加到面板的中部位置
JButton btn = new JButton(START);// 创建一个按钮,并设置文本为"开始"
JPanel southPanel = new JPanel();// 创建一个新的面板
southPanel.add(btn);// 将按钮添加到面板中
c.add(southPanel, BorderLayout.SOUTH);// 将面板添加到窗口的下部位置
setContentPane(c);// 将面板设置为窗口的内容面板
// 按钮监听器
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String btnText = btn.getText();// 获取按钮文本
if (START.equals(btnText)) {// 如果单击了开始按钮
if (list.size() == 0) {// 如果奖池没有名单了
screen.setText("谢谢参与");
btn.setVisible(false);// 隐藏按钮
JOptionPane.showMessageDialog(LotterySystem.this, "所有的号码都抽完了");// 弹出对话框
} else {
btn.setText("停止");
startDraw();
}
} else if (STOP.equals(btnText)) {
stopDraw();
btn.setText("开始");
}
}
});
}
// 开始抽奖
private void startDraw() {
Thread t = THREAD_LOCAL.get();// 从选中获取线程
if (t == null) { // 如果线程是空
t = new Thread() { // 创建新线程
public void run() {
System.out.println("开始抽奖");
try {
while (true) {
if (interrupted()) {// 如果中断
throw new InterruptedException();
}
for (String tmp : values) {
screen.setText(tmp);
}
}
} catch (InterruptedException e) {
int winningIndex = random.nextInt(list.size());// 随机获取中奖者索引
screen.setText(list.remove(winningIndex));// 抽取中奖者,并显示在屏幕上
System.out.println("停止抽奖");
}
}
};
THREAD_LOCAL.set(t);
}
t.start();
}
// 停止抽奖
private void stopDraw() {
Thread t = THREAD_LOCAL.get();
if (t != null) {// 如果线程不为空
if (!Thread.interrupted()) {
t.interrupt();// 中断线程
}
THREAD_LOCAL.set(null);
}
}
public static void main(String[] args) {
LotterySystem frame = new LotterySystem();
frame.setVisible(true);
}
}
简单来说
这段代码是一个基于Java Swing实现的抽奖系统,主要功能是根据预设的号码数组values[],从中随机抽取一个号码,将其显示在GUI界面上。具体解释如下:
导入必要的Java AWT, Swing以及其他相关的类库。
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
创建一个继承了JFrame的LotterySystem类,用于实现GUI操作。
定义了一个String类型的数组:values[],用来存储所有可以被抽中的号码。其中每个号码都被屏蔽了一部分数字,只显示前几位和后几位,保障了号码的私密性。
定义了一个ThreadLocal对象,用来存储当前线程中选中的号码。
定义了常量START和STOP,分别表示开始和停止状态下的按钮文本。
定义了一个List集合list,用于存储所有可以被抽中的号码。
定义了一个Random对象random,用于实现随机数的生成。
定义了一个JLabel对象screen,用于显示当前被抽中的号码。
实现了构造函数LotterySystem(),用于初始化整个界面。
创建了一个JPanel对象c,并将其设置为BorderLayout布局。这个对象包含两个部分:第一个部分是screen标签,用于显示当前抽中的号码;第二个部分是一个按钮,用于开始或停止抽奖。
创建了一个JButton对象btn,并将其文本设置为"开始"。同时,创建了一个新的JPanel对象southPanel,将btn对象添加到southPanel中,并将其设置为BorderLayout.SOUTH位置(即在界面的下方)。
将screen和southPanel添加到c中,并将整个c设置为JFrame的Content Pane。
实现了按钮监听器,用于对按钮的单击事件进行响应。如果当前状态是"开始",则判断奖池中是否还有号码,如果有则启动一个新的线程进行抽奖,否则提示游戏结束。如果当前状态是"停止",则停止当前线程。
实现了startDraw()方法,用于开始启动抽奖线程。随机生成一个获奖者的索引,从奖池中移除该号码,并将该号码显示在屏幕上。
实现了stopDraw()方法,用于停止当前抽奖线程。
实现了main()方法,用于启动整个程序。创建一个LotterySystem对象,并将其设置为可见状态。