实现图片抽奖(可加入暗箱操作)全部代码,年会超实用!!!

目录

一 、设置背景

 二、设置用户类别

三、设置默认用户

四、设置学生用户类别抽奖

五、设置老师用户类别抽奖

 六、创建判断用户种类方法

 七、主体代码

八、关于黑白名单设置

 九、注意点

十、运行效果


一 、设置背景

package com.hubstc.lottery;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

public class BackgroundPanel extends JPanel{
 Image image;
 public BackgroundPanel(Image image){
  super();
  this.setOpaque(false);//是否透明
  this.setLayout(null);//添加组件布局,空布局更自由没有顺序,可以通过setBounds()设计
  this.image=image;
  
 }
 @Override
 //右键source找
 protected void paintComponent(Graphics g) {
  // TODO Auto-generated method stub
  if(image!=null){
   int width=this.getWidth();
   int height=this.getHeight();
   g.drawImage(image, 0, 0, width, height,this);
  }
  super.paintComponent(g);
 }

}

 二、设置用户类别

package com.hubstc.lottery;
public abstract class Person {
  
    protected String no;
    protected String name;
    //区分教师和学生用户类别,创造类型
    protected int type;
    
    //用final保证种类无法修改
    //区分学生和教师信息,没有具体信息就显示校名
    public static final int TYPE_DEFAULT=0;
    public static final int TYPE_STUDENT=1;
    public static final int TYPE_TEACHER=2; 
    public Person(String no, String name, int type) {
  super();
  this.no = no;
  this.name = name;
  this.type = type;
 }
 public String getNo() {
  return no;
 }
 public void setNo(String no) {
  this.no = no;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getType() {
  return type;
 }
 public void setType(int type) {
  this.type = type;
 }
 public static int getTypeDefault() {
  return TYPE_DEFAULT;
 }
 public static int getTypeStudent() {
  return TYPE_STUDENT;
 }
 public static int getTypeTeacher() {
  return TYPE_TEACHER;
 }
    
    
    //用下面的方法获取信息,下面的方法将重写
    public abstract String getTitle();
    public abstract String getPicPath();

    public boolean isValid()
    {
    	if(no==null||no.isEmpty()||name==null||name.isEmpty())
    	{
    	return false;	
    	}
    	return true;
    }
    public boolean equals(Person person)
    {
    	//当前对象是无效的或者当前比较的参数是无效的
    	if(!this.isValid()|| !person.isValid()){
    		return false;
    	}
    	//如果两个成员对应相等,说明相等返回true
    	if(no.equals(person.no) &&name.equals(person.name)){
    		return true;
    	}
    	//如果上面都不满足就返回false
    	return false;
    }
}

三、设置默认用户

package com.hubstc.lottery;

public class default01 extends Person{

  @Override
	public String getPicPath() {
		// TODO Auto-generated method stub
	  String path="/imgs/"+"logo.jpg";
		return path;
	}
//默认没有号码和姓名
  public default01() {
   super("","", Person.TYPE_DEFAULT);
   // TODO Auto-generated constructor stub
  }
  
  
 @Override
 public String getTitle() {
  // 区别教师和老师的存在
  return "湖北科技职业学院";
 }

}

四、设置学生用户类别抽奖

package com.hubstc.lottery;
//继承父类Person
public class Student01 extends Person{

@Override
	public String getPicPath() {
		// TODO Auto-generated method stub
	 String path="/imgs/student/"+no+".jpg";
		return path;
	}
public Student01(String no, String name) {
super(no, name ,Person.TYPE_STUDENT);
// TODO Auto-generated constructor stub
}
//我们进行类的定义可以不用主方法
@Override
public String getTitle() {
String title="学号"+no+"姓名"+name;
return title;
}
}

五、设置老师用户类别抽奖

package com.hubstc.lottery;
public class teacher01 extends Person{

  @Override
	public String getPicPath() {
		// TODO Auto-generated method stub
	  String path="/imgs/teacher/"+no+".jpg";
	  return path;
	}

public teacher01(String no, String name) {
   super(no, name, Person.TYPE_TEACHER);
   // TODO Auto-generated constructor stub
  }

  public static void main(String[] args) {
   // TODO Auto-generated method stub

  }

  public String getTitle() {
   String title="工号"+no+"姓名"+name;
   return title;
  }
 }

 六、创建判断用户种类方法

package com.hubstc.lottery;
public class PersonFactory {
 //写一个静态方法(公有方法)去调用
  public static Person getPerson(int type,String no,String name){
    Person person=null;
    //根据类型判断用户类型
    if(no==null||no.isEmpty()||name==null||name.isEmpty()){
     person=null;
    }
    else{
     if(type==Person.TYPE_STUDENT){
      person=new Student01(no,name);
      
     }
     else if(type==Person.TYPE_TEACHER){
      person=new teacher01(no,name);
     }
    }
    if(person==null){
     person=new default01();
    }
   return person;
  }
 }

 七、主体代码


package com.hubstc.lottery;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class MainFrameApp extends JFrame implements Runnable{
 //给出下面这个mainFrameApp类的定义
 //ButtonGroup 对单选项进行归组
 private ButtonGroup group=new ButtonGroup();
 //添加按钮
 private JRadioButton rbStu=new JRadioButton("学生");
 private JRadioButton rbTeacher=new JRadioButton("教师");
 
 private JButton btnStart=new JButton("开始抽奖");
 private JButton btnReset=new JButton("重置抽奖结果");
 
 //标签显示
 private JLabel picLabel=new JLabel("",JLabel.CENTER);//图片标签居中显示
 private JLabel titleLabel=new JLabel("",JLabel.CENTER);//文字标签居中显示
 
 private int type=Person.TYPE_STUDENT;
 private List<Person> persons;
 private List<Person> listBlack;
 private List<Person> listWhite;
 //控制循环开始执行
 private boolean flag;
 
 //开始写类的构造方法
 public MainFrameApp(){
  //开始设置窗口
  this.setTitle("随机抽奖系统");//设置标题栏
  this.setBounds(650,200,450,600);//排版
  this.setResizable(false);//是否允许重新设定窗口
  //添加图片 在项目用folder创建文件夹,找到文件夹路径把图片复制进去
  BackgroundPanel bp =new BackgroundPanel
  (Toolkit.getDefaultToolkit().getImage(MainFrameApp.class.getResource("/imgs/main.png")));
     //把中间容器设置到底层容器中
  this.setContentPane(bp);
  //添加开始按钮和重新抽奖按钮
  btnStart.setBounds(20,20,130,40);
  btnReset.setBounds(150, 20, 130, 40);
  //把按钮添加到背景面板中
  bp.add(btnStart);bp.add(btnReset);
//添加监视器                                                                                                                                                                                                                                                                                                                                                                                                               
  btnStart.addActionListener(new ActionListener(){

 @Override
 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  System.out.println("开始抽奖");
  startRun();//合并到开始抽奖方法
 }
   
  });
  
//添加监视器
  btnReset.addActionListener(new ActionListener(){

  @Override
  public void actionPerformed(ActionEvent e) {
   // TODO Auto-generated method stub
   System.out.println("重置抽奖结果");
   initialUI();
   initialData();
  }
    
   });
  
  group.add(rbStu);group.add(rbTeacher);
  rbStu.setBounds(320, 10, 100, 20);
  rbTeacher.setBounds(320, 35, 100, 20);
  bp.add(rbStu);bp.add(rbTeacher);
  
  rbStu.addActionListener(new ActionListener(){

 @Override
 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  System.out.println("学生类别抽奖");
  type=Person.TYPE_STUDENT;
  initialData();
 }
   
  });
  rbTeacher.addActionListener(new ActionListener(){

  @Override
  public void actionPerformed(ActionEvent e) {
   // TODO Auto-generated method stub
   System.out.println("教师类别抽奖");
   type=Person.TYPE_TEACHER;
   initialData();
  }
    
   });
  
  picLabel.setBounds(90,85,250,300);
  titleLabel.setBounds(60, 380, 300, 50);
  Font font=new Font("隶书",Font.BOLD,24);//字体,字形,字号
  titleLabel.setFont(font); 
  titleLabel.setForeground(Color.RED);
  bp.add(picLabel);bp.add(titleLabel);
  
  initialUI();
  initialData();
 }
  //对界面进行初始化getTitle picLabel 
 //初始化数据
 //initialData
public void initialUI(){
 rbStu.setSelected(true);
 flag=true;
 Person person=PersonFactory.getPerson(Person.TYPE_DEFAULT, "", "");
 displayUI(person); 
}

private void displayUI(Person person){
	 titleLabel.setText(person.getTitle());
	 ImageIcon icon=new ImageIcon(Toolkit.getDefaultToolkit().getImage
			 (MainFrameApp.class.getResource(person.getPicPath())));//显示各个用户自己的图片
	 picLabel.setIcon(icon);
}

private void initialData(){
	try{
	persons=FileInfoUtils.getFileInfo(type,FileInfoUtils.CONFIG_TYPE);//普通名单
	listWhite=FileInfoUtils.getFileInfo(type,FileInfoUtils.WHITE_TYPE);//黑名单
	listBlack=FileInfoUtils.getFileInfo(type,FileInfoUtils.BLACK_TYPE);//白名单
	
	}
	catch(Exception e){
		e.printStackTrace();
	}
}

//四个按钮同时起作用,可用或者不可用
private void setBtnEnable(boolean falg){
	btnStart.setEnabled(falg);
	btnReset.setEnabled(falg);
	rbStu.setEnabled(falg);
	rbTeacher.setEnabled(falg);
}

private void startRun(){
	setBtnEnable(false);
	Thread thread =new Thread (this);
	thread.start();//线程自动调用run方法
}


	@Override
	//重写run方法,实现循环遍历图片和学号
	public void run() {
	//displayUI(persons.get(i))
	int size=persons.size();
	//计数器,也就是滚动播放的次数
	int count=0;
	int currentId=0;
	
	
	Random rd=new Random();
	int rdm=rd.nextInt(size);
	
	
	while(flag)//取一遍集合中元素
	{
		//取的是第几个元素
		currentId=count%size;
		displayUI(persons.get(currentId));
		
		if(count==90+rdm)//循环次数
		{
		flag=false;
		}
		//设置越接近结果就越慢
		int time;
		if(count<40)
		{
			time=30;
		}
		else if(count<100)
		{
			time=100;
		}
		else
		{
			time=200;
		}
		try {
			Thread.sleep(30);//进程休息,让出使用权
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		count++;
	}
	doConfigure();//配置黑白名单,区分中奖用户类群
	flag=true;
	setBtnEnable(true);
	}
	
	
	private void doConfigure(){
		//有白名单,没有黑名单
		if(isValid(listWhite)&& !isValid(listBlack))
		{
			randomDisplay(listWhite);
		}
		//有黑名单,没有白名单,并且普通名单里面减去黑名单
		else if(isValid(listBlack)&& !isValid(listWhite))
		{
			//写一个方法实现普通名单里面删除黑名单
			List<Person> outBlackPerson=getPersonOutBlack();
			randomDisplay(outBlackPerson);
		}
		//黑名单和白名单都有
		else if(isValid(listBlack)&& isValid(listWhite)){
			if(isWhiteInBlack())
			{
			randomDisplay(listWhite);	
			}
		}
	}
	
	private boolean isWhiteInBlack(){
		for(int i=0;i<listWhite.size();i++){
			Person whitePerson=listWhite.get(i);//从白名单里面取出一个对象
		
		for(int j=0;j<listBlack.size();j++){
			Person blackPerson=listBlack.get(j);//从黑名单里面取出一个对象
			if(whitePerson.equals(blackPerson))
			{
				return true;
			}
		}
		}
		return false;
	}
	
	private List<Person> getPersonOutBlack(){
		List<Person> outBlackPersons=new ArrayList<>();
		
		for(int i=0;i<persons.size();i++)//persons是普通名单
		{
			Person person=persons.get(i);//普通名单里面取出一个对象
			for(int j=0;j<listBlack.size();j++)
			{
				Person blackPerson=listBlack.get(j);//黑名单里面取出一个对象
				if(!person.equals(blackPerson))
				{
					outBlackPersons.add(person);
				}
			}
		}

		return outBlackPersons;
	}
	
	private void randomDisplay(List<Person> list)
	{
		int size=list.size();
		Random rd=new Random();
		int rdm =rd.nextInt(size);
		displayUI(list.get(rdm));
	}
	
	
	
	
	private boolean isValid(List<Person> list)
	{
		if(list==null||list.size()<1)
		{
			return false;
		}
		for(int i=0;i<list.size();i++)
		{
			Person person=list.get(i);
			if(person.isValid())//person is valid
			{
				return true;
			}
		}
		return false;
	}
	
	
	
	
public static void main(String[] args) {

 //设置这种风格以后,学生教师按钮没有边框
  try {
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
  MainFrameApp frame=new MainFrameApp();
  frame.setVisible(true);
}


}

八、关于黑白名单设置

package com.hubstc.lottery;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

//这个类写根据用户类型的不同读不同的文件
public class FileInfoUtils {
	//一个用户类型定义三个类型名单
	public static final int CONFIG_TYPE=0;//普通文件
	public static final int WHITE_TYPE=1;//白名单
	public static final int BLACK_TYPE=2;//黑名单

	public static List<Person> getFileInfo(int personType,int fileType) throws IOException{
		{
			String prefix="";//定义前缀
			String filePath="/res/";
			//根据用户类型判断,读文件的路径
			if(fileType==CONFIG_TYPE)
			{
				
			}//没有前缀
			else if(fileType==WHITE_TYPE)
				
			{
				prefix="white_";
			}
			else if(fileType==BLACK_TYPE)
			{
				prefix="black_";
			}
			if(personType==Person.TYPE_STUDENT)
			{
				filePath=filePath+prefix+"student.txt";
			}
			else if(personType==Person.TYPE_TEACHER)
			{
				filePath=filePath+prefix+"teacher.txt";
			}
			URL url=FileInfoUtils.class.getResource(filePath);
			//获得路径
			File file=new File(url.getPath());
			
	        List<Person> personList=new ArrayList<Person>();	
			FileReader fr=new FileReader(file);
			BufferedReader br=new BufferedReader(fr);//分行读取
			String line="";
			//创建相应的对象
			while((line=br.readLine())!=null)
			{
				System.out.println(line);
				String[] flag=line.split(" ");
				if(flag==null || flag.length!=2)
				{
						continue;//break是跳出本层循环
				}
				String no=flag[0];//System.out.println(flag[0]);
				String name=flag[1];//System.out.println(flag[1]);
				if(no==null||no.isEmpty()||name==null||name.isEmpty())
				{
					continue;
				}
				Person person=PersonFactory.getPerson(personType, no, name);
				personList.add(person);
			}
			   br.close();
			   fr.close();
			   //PersonFactory.getPerson(int,String,String);getTitle
			   return personList;
		}
		}	
	}

 九、注意点

 注意黑白名单,图片的设置路径。注意txt文件的编码方式需要另存为ANSI编码模式

十、运行效果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值