java模拟一个抽奖程序

 今天用一个程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序
 * 需要使用Java的图形界面知识
 * 窗口  JFrame
 * 面板  JPanel
 * 显示文本信息的标签  JLabel
 * 文本框 JTextField
 * 按钮  JButton

还涉及到线程Thread

先看效果图:

但是这里留一个问题?就是去除重复数字(可以自己先实现,后期我会上传的)

下面看看代码,代码中有注释,不懂留言:

package thread.test1;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


/**
 * 本程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序
 * 需要使用Java的图形界面知识
 * 窗口  JFrame
 * 面板  JPanel
 * 显示文本信息的标签  JLabel
 * 文本框 JTextField
 * 按钮  JButton
 * 
 * */
public class GoodLuck_1 extends JFrame {
	JPanel pn1=null;
	JPanel pn2;
	JPanel pn3;
	JTextField tf=null;
	JLabel msg=null;
	JButton btn1;
	JButton btn2;
	boolean flag=true;//用于判断是否继续输出出奖号码的标志。
	
	//在构造器中,初始化界面
	public GoodLuck_1(){
		tf=new JTextField(40);//参数意思是,该文本框能够放多少个字符
		pn1=new JPanel();
		//组件放在面板上
		pn1.add(tf);
		//将面板放在窗口上,当前窗口对象就是this,放在顶部(上北)
		this.add(pn1, BorderLayout.NORTH);
		/*
		 * Java的JFrame对象,默然的布局管理器是“边界布局” 类名是BorderLayout
		 * 
		 * */
		msg=new JLabel("欢迎访问好运气抽奖程序!");
		pn2=new JPanel();
		pn2.add(msg);
		//面板放在窗体上
		this.add(pn2, BorderLayout.CENTER);
		
		//底部的按钮部分
		btn1=new JButton("开始");
		
		//给开始按钮加入事件
		btn1.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//给出奖标志赋值
				/*
				flag=true;
				chouJiang();
				*/
				/*
				 * 必须使用多线程技术,重新启动一个新的线程,去赋值flag
				 * 接着调用chouJiang(), 才可以是程序恢复响应。
				 * */
				class ThreadStart extends Thread {
					@Override
					public void run() {
						// TODO Auto-generated method stub
						//在这里去调用抽奖方法
						flag=true;
						chouJiang();
					}
				}
				
				//必须将上面的线程内部类,实例化,之后启动
				new ThreadStart().start();
			}
			
		});
		
		btn2=new JButton("停止");
		
		//给停止按钮添加事件监听
		btn2.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//必须启动一个新的停止线程,才能终止无限循环
				class ThreadStop extends Thread{
					@Override
					public void run() {
						// TODO Auto-generated method stub
						flag=false;
					}
				}
				
				//启动上面的内部类线程
				new ThreadStop().start();
			}
			
		});
		
		pn3=new JPanel();
		pn3.add(btn1);
		pn3.add(btn2);
		
		this.add(pn3, BorderLayout.SOUTH);
		
		//设置窗口的属性
		this.setTitle("好运气中奖程序1.0");
		this.setSize(500, 400);
		this.setLocation(100, 50);
		//JFrame默认的关闭按钮,只是隐藏窗口,需要重写设计关闭功能
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
		//chouJiang();
	}
	
	//对于一个复杂的任务,首先想到的是封装方法
	public void chouJiang(){
		/*
		 * 由于开始按钮启动后,什么时候停止,不确定,因此循环次数也不确定
		 * 需要使用while循环,而且开始就是无限循环
		 * */
		String text="";  //作用是显示在文本框中的号码序列
		while(flag){
			/**
			 * 每次循环都是从1-32之间,随机抽取7组号码,拼成字符串
			 * 显示在文本框中
			 * */
			text="";  //每次显示号码时,都重新显示新抽的号码
			for(int i=0;i<7;i++){
				int m=(int)(Math.random()*32+1);
				if(m<10){
					text=text+"  0"+m;
				}
				else {
					text=text+"  "+m;
				}
			}
			//这里需要一点时间的停顿,否则循环太快,会出问题
			
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//显示在文本框中
			tf.setText(text);
		}
		
	}
	
	public static void main(String[] args) {
		//在正在的开发中,main方法中的代码,越少越好。
		new GoodLuck_1();
	}

}

 有需要的自己那过去试一试,玩一玩!

posted @ 2017-05-30 23:08  懒得烧蛇吃  阅读(4232)  评论(0编辑  收藏  举报