目录
一 、设置背景
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编码模式