前几天参加一个抽奖送手机(p9)的活动,没有抽到,好心酸,当时人很多,所以用了抽取幸运号码的方式来抽奖,突然想挑战一下自己能不能做一个出来。
一、实现思路
码字有点麻烦,来张图
首先是界面,用到的都是Swing组件,有Jframe->Jpanel->JTextArea->JButton->JLabel等,具体的布局还有各个组件的属性可以凭自己喜好,我做的界面如下
口味有点重,谅解!!!!
二、实现细节
1、如何实现随机数滚动
看图,我们先把粉色框里的数取出来+1,作为产生随机数的范围,用一个整型数来得到一个随机数,作为蓝色文本框的内容,然后当点击开始的时候吗,用线程来控制
,比如每200个毫秒,就将蓝色框中的内容刷新一次,这样就让随机数滚动起来了。
那就涉及到线程的启动和停止了,线程启动很简单,start就行了,可停止呢,其实线程的停止与启动最好使用一个布尔型的Flag,当flag为真,让它启动,反之停止。
2.如何抓取滚动中的数并且可以抓五个
抓取很简单,直接用一个黄色文本框setText为蓝色文本框的值。但一个一个指定有点麻烦,所以这个地方我是这样实现的,用一个case语句,和一个局部变量i,比如第一次点击,设置完第一个文本框的Text,将i加1,那么下一次点击时就可以设置下一个框的值了。
清空:直接让五个文本框的值为NULL就可以了,让i回到初始值。
3.具体的点击事件在下边的代码。
三、代码实现
package classDemo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class GetRandomNumber implements Runnable,ActionListener{
//主界面
static JFrame _randomNumber = new JFrame("random");
//主panel
static JPanel _mainPanel = new JPanel();
//这个面板用来放置label和随机数范围输入框的
static JPanel _randPanel = new JPanel();
//随机数输入框
static JLabel _randLabel = new JLabel("请输入随机数范围:");
static JTextArea _numRange = new JTextArea(1,10);
//用来获取随机数的文本框
static JTextField _num = new JTextField();
static JTextArea jta3 = new JTextArea(1,3);
static JTextArea jta4 = new JTextArea(1,3);
static JTextArea jta5 = new JTextArea(1,3);
static JTextArea jta6 = new JTextArea(1,3);
static JTextArea jta7 = new JTextArea(1,3);
//五个功能按钮
static JButton _start = new JButton("开始");
static JButton _stop = new JButton("停止");
static JButton _getOne = new JButton("抽取");
static JButton _setNull = new JButton("清空");
//用于线程启动与停止的flag
static boolean boo = false;
//随机数种子
Random random = new Random();
int a;
String s ;
public static void main(String[] args) {
final GetRandomNumber test = new GetRandomNumber();
//添加启动监听事件
_start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
test.condition();
} catch (Exception e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
});
//添加停止监听事件
_stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
boo =true;
}
});
//另外两个按钮的监听
_getOne.addActionListener(test);
_setNull.addActionListener(test);
}
//构造方法
public GetRandomNumber(){
//为了让界面美观一点的属性设置
_randLabel.setFont(new Font(null, Font.BOLD, 20));
_randLabel.setForeground(Color.BLACK);
_numRange.setBackground(Color.pink);
_numRange.setFont(new Font(null, Font.BOLD, 20));
_num.setText("1");
_num.setFont(new Font(null, Font.CENTER_BASELINE, 200));
_num.setHorizontalAlignment(SwingConstants.CENTER);
_num.setEditable(false);
_num.setBackground(Color.BLUE);
_num.setForeground(Color.GREEN);
//字体设置
jta3.setFont(new Font(null, Font.CENTER_BASELINE, 20));
jta4.setFont(new Font(null, Font.CENTER_BASELINE, 20));
jta5.setFont(new Font(null, Font.CENTER_BASELINE, 20));
jta6.setFont(new Font(null, Font.CENTER_BASELINE, 20));
jta7.setFont(new Font(null, Font.CENTER_BASELINE, 20));
//前景色
jta3.setForeground(Color.RED);
jta4.setForeground(Color.RED);
jta5.setForeground(Color.RED);
jta6.setForeground(Color.RED);
jta7.setForeground(Color.RED);
//背景色
jta3.setBackground(Color.ORANGE);
jta4.setBackground(Color.ORANGE);
jta5.setBackground(Color.ORANGE);
jta6.setBackground(Color.ORANGE);
jta7.setBackground(Color.ORANGE);
//添加组件
_randPanel.add(_randLabel);
_randPanel.add(_numRange);
_randomNumber.add(_randPanel,BorderLayout.NORTH);
_randomNumber.add(_num);
_mainPanel.add(_start);
_mainPanel.add(_stop);
_mainPanel.add(_getOne);
_mainPanel.add(_setNull);
_mainPanel.add(jta3);
_mainPanel.add(jta4);
_mainPanel.add(jta5);
_mainPanel.add(jta6);
_mainPanel.add(jta7);
_randomNumber.add(_mainPanel,BorderLayout.SOUTH);
//设置主面板的一些属性
_randomNumber.setBounds(0,0,700,500);
_randomNumber.setResizable(false);
_randomNumber.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
_randomNumber.setVisible(true);
}
//取得自定义随机数的范围
public int num(){
//产生由1-a的随机数
a= random.nextInt(Integer.valueOf(_numRange.getText()))+1;
return a;}
//线程的启动条件
public void condition()throws Exception{
if(!_num.getText().toString().equals(null)){
boo = false;
Thread t1 = new Thread(this);
t1.start();
}else{
System.out.println("输入为空");
throw new Exception("请输入数字范围");
}
}
//重写的run方法
@Override
public void run() {
// TODO 自动生成的方法存根
while(!boo){
try {
Thread.sleep(200);
s = String.valueOf(num());
_num.setText(s);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
System.out.println("异常");
}
}
}
//i设置为三方便后边找输入框时方便
int i=3;
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
Object o1 = e.getSource();
//每点击一次,相应输入框显示取得的数字
if(o1==_getOne){
switch(i){
case 3:jta3.setText(_num.getText());
break;
case 4:jta4.setText(_num.getText());
break;
case 5:jta5.setText(_num.getText());
break;
case 6:jta6.setText(_num.getText());
break;
case 7:jta7.setText(_num.getText());
break;
}
i=i+1;
}
//点击清空的时候,所有文本框设为NULL,i回到3
else if(o1==_setNull){
jta3.setText(null);
jta4.setText(null);
jta5.setText(null);
jta6.setText(null);
jta7.setText(null);
i=3;
o1=_getOne;
}
}
}