第一个小项目:拼图小游戏
暂不完善,因为没有链接数据库,用户名和密码只是暂存在集合中
资料
界面展示
代码:
一.主程序(入口)App
import com.qi.ui.GameJFrame;
import com.qi.ui.LoginJFrame;
import com.qi.ui.RegisterJFrame;
public class App {
public static void main(String[] args) {
// new GameJFrame();
new LoginJFrame();
// new RegisterJFrame();
}
}
二.游戏界面 GameJFrame
package com.qi.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
/*
* 创建一个游戏的主界面
* */
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
//获取随机数
Random r = new Random();
//创建一个二维数组
//目的:用来管理数据
//加载图片的时候,会根据二维数组中的数据进行加载
int[][] data = new int[4][4];
//记录空白方块在二维数组中的位置
int x = 0;
int y = 0;
//定义一个变量,记录当前展示图片的路径
String path = "image\\animal\\animal3\\";
//定义一个二维数组,存储正确的数据
int[][] win = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0},
};
//定义变量用来统计步数
int step = 0;
//创建选项下面的条目对象
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
//更换图片:美女,动物,运动选项
JMenuItem girl = new JMenuItem("美女");
JMenuItem animal = new JMenuItem("动物");
JMenuItem sport = new JMenuItem("运动");
//关于我们:公众号选项
JMenuItem accountItem = new JMenuItem("公众号");
//空参构造
public GameJFrame() {
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱)
initData();
//初始化图片(根据打乱之后的结果去加载图片)
initImage();
//窗体默认隐藏,让其显示出来
this.setVisible(true);
}
//初始化界面
private void initJFrame() {
//设置窗体的宽高
this.setSize(603, 680);
//设置窗体的标题
this.setTitle("拼图单机版 v1.0");
//设置窗体置顶
this.setAlwaysOnTop(true);
//设置窗体居中
this.setLocationRelativeTo(null);
//设置关闭模式
// this.setDefaultCloseOperation(3);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
//初始化菜单
private void initJMenuBar() {
//创建整个的菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上面的两个选项的对象(功能 关于我们)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//功能下的更换图片选项
JMenu changeImage = new JMenu("更换图片");
//把美女,动物,运动添加到更换图片当中
changeImage.add(girl);
changeImage.add(animal);
changeImage.add(sport);
//将每一个选项下面的条目添加到选项当中去
//将更换图片添加到功能中;JMenu里可以再添加JMenu
functionJMenu.add(changeImage);
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
//把公众号添加到关于我们当中
aboutJMenu.add(accountItem);
//给条目绑定事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//给美女,动物,运动添加绑定事件
girl.addActionListener(this);
animal.addActionListener(this);
sport.addActionListener(this);
//将菜单里面的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
//初始化数据(打乱)
private void initData() {
//1.定义一个一维数组
int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
//2.打乱数组中的数据的顺序
//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
Random r = new Random();
for (int i = 0; i < tempArr.length; i++) {
//获取随机索引
int index = r.nextInt(tempArr.length);
//拿着遍历到的每一个数据,跟随机索引上的数据进行交换
int temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
}
//3.给二维数组添加数据
//遍历一位数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中
for (int i = 0; i < tempArr.length; i++) {
if (tempArr[i] == 0) {
x = i / 4;
y = i % 4;
}
data[i / 4][i % 4] = tempArr[i];
}
}
//初始化图片和步数(即初始化隐藏容器里的内容)
//添加图片的时候,就需要按照二维数组中管理的数据添加图片
private void initImage() {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
if (victory()) {
//显示胜利的图标
JLabel winJLabel = new JLabel(new ImageIcon("image\\win.png"));
winJLabel.setBounds(203, 283, 197, 73);
this.getContentPane().add(winJLabel);
}
//将步数添加到隐藏容器里
JLabel stepCount = new JLabel("步数:" + step);
stepCount.setBounds(50, 30, 100, 20);
this.getContentPane().add(stepCount);
//细节:
//先加载的图片在上方,后加载的图片塞在下面。
//外循环 --- 把内循环重复执行了4次
for (int i = 0; i < 4; i++) {
//内循环 --- 表示在一行添加4张图片
for (int j = 0; j < 4; j++) {
int num = data[i][j];
//创建一个JLabel的对象(管理容器)
//目录下没有16.jpg,JLabel找不到图片,会自动加载一张空白图片
JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
//指定图片位置
jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
//给图片添加边框
//0:表示让图片凸起来
//1:表示让图片凹下去
jLabel.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
//获取隐藏容器,并且将jLabel1添加到隐藏容器当中
this.getContentPane().add(jLabel);
}
}
JLabel background = new JLabel(new ImageIcon("image\\background.png"));
background.setBounds(40, 40, 508, 560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松会调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == 65) {
//把界面中所有的图片全部删除
this.getContentPane().removeAll();
//加载第一张完整的图片
JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
all.setBounds(83, 134, 420, 420);
this.getContentPane().add(all);
//加载背景图片
JLabel background = new JLabel(new ImageIcon("image\\background.png"));
background.setBounds(40, 40, 508, 560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
}
//松开按键的时候会调用这个方法
@Override
public void keyReleased(KeyEvent e) {
//判断游戏是否胜利,如果胜利,此方法需要直接结束,不能再执行下面的移动代码了
if (victory()) {
return;
}
//对上,下,左,右进行判断
//左:37 上:38 右:39 下:40
int code = e.getKeyCode();
if (code == 37) {
if (y == 3) {
return;
}
data[x][y] = data[x][y + 1];
data[x][y + 1] = 0;
y++;
//每移动一次,计数器就自增一次
step++;
initImage();
} else if (code == 38) {
if (x == 3) {
//表示空白方块已经在最下方了,他的下面没有图片再能移动了
return;
}
/*
* 逻辑:把空白方块下方的数组往上移动
* x,y 表示空白方块的位置
* x+1 , y 表示空白方块下方的图片的数字
* */
//把空白方块下方的数字赋值给空白方块
data[x][y] = data[x + 1][y];
data[x + 1][y] = 0;
//更新空白方块的位置
x++;
//每移动一次,计数器就自增一次
step++;
//调用方法按照最新的数字加载图片
initImage();
} else if (code == 39) {
if (y == 0) {
return;
}
data[x][y] = data[x][y - 1];
data[x][y - 1] = 0;
y--;
//每移动一次,计数器就自增一次
step++;
initImage();
} else if (code == 40) {
if (x == 0) {
return;
}
data[x][y] = data[x - 1][y];
data[x - 1][y] = 0;
x--;
//每移动一次,计数器就自增一次
step++;
initImage();
}
//当松开按键A时,重新加载打乱顺序的图片
else if (code == 65) {
initImage();
}
//当松开按键W时,直接加载顺序的图片
else if (code == 87) {
//直接给二维数组data进行赋值
data = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0},
};
initImage();
}
}
//判断data数组中的数据是否跟win数组中相同
//如果全部相同,返回true,否则返回false
public boolean victory() {
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] != win[i][j]) {
//只要有一个数据不一样,则返回false
return false;
}
}
}
//当循环结束表示数组遍历比较完毕,全部一样返回true
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
//按下重新游戏
if (obj == replayItem) {
System.out.println("重新游戏");
//计步器清零
step = 0;
//再次打乱二维数组中的数据
initData();
//重新加载图片
initImage();
}
//按下重新登录
else if (obj == reLoginItem) {
System.out.println("重新登录");
//关闭当前的游戏界面
this.setVisible(false);
//打开登录界面
new LoginJFrame();
}
//按下关闭游戏
else if (obj == closeItem) {
System.out.println("关闭游戏");
//直接关闭虚拟机即可
System.exit(0);
}
//按下公众号
else if (obj == accountItem) {
System.out.println("公众号");
//创建一个弹框对象JDialog
JDialog jDialog = new JDialog();
//创建一个管理图片的容器对象JLabel
JLabel jLabel = new JLabel(new ImageIcon("image\\damie.jpg"));
//设置位置和宽高,此时的原点为弹窗的左上角
jLabel.setBounds(0, 0, 258, 258);
//把图片添加到弹框当中
jDialog.getContentPane().add(jLabel);
//给弹框设置大小
jDialog.setSize(344, 344);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//让弹框不关闭则无法操作下面的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
}
//按下更换图片中的美女选项
else if (obj == girl) {
int temp = r.nextInt(13) + 1;
path = "image\\girl\\girl" + temp + "\\";
//计步器清零
step = 0;
//再次打乱二维数组中的数据
initData();
//重新加载图片
initImage();
}
//按下更换图片中的动物选项
else if (obj == animal) {
int temp = r.nextInt(8) + 1;
path = "image\\animal\\animal" + temp + "\\";
//计步器清零
step = 0;
//再次打乱二维数组中的数据
initData();
//重新加载图片
initImage();
}
//按下更换图片中的运动选项
else if (obj == sport) {
int temp = r.nextInt(10) + 1;
path = "image\\sport\\sport" + temp + "\\";
//计步器清零
step = 0;
//再次打乱二维数组中的数据
initData();
//重新加载图片
initImage();
}
}
}
三.用户类 User
package com.qi.ui;
public class User {
private String username;
private String password;
public User() {
}
public User(String user, String password) {
this.username = user;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
四.工具类:随机生成验证码 CodeUtil
package com.qi.ui;
import java.util.Random;
/*
* 工具类:用来生成5位数的验证码,包括4位字母(字母可以是大写也可以是小写)和一位数字
* */
public class CodeUtil {
//定义一个字符数组,用来存储所有的大写字母和小写字母
static char[] c = new char[52];
//数字采用随机数
static Random r = new Random();
//使用静态代码块初始化数组,因为静态代码块在进入本类的时候最先执行
static{
for (int i = 0; i < c.length; i++) {
if (i <= 25) {
c[i] = (char) (65 + i);
} else {
c[i] = (char) (97 + i - 26);
}
}
}
public static String getCode() {
//把验证码定义在此处,则每次调用该方法都会生成一个新的验证码
String code = "";
int temp = r.nextInt(4);
//1.先随机抽取temp个字母
for (int i = 0; i < temp; i++) {
int index = r.nextInt(c.length);
code = code + c[index];
}
//2.再随机抽取一个数字
code = code + r.nextInt(10);
//3.再随机抽取4-temp个字母
for (int i = 0; i < (4-temp); i++) {
int index = r.nextInt(c.length);
code = code + c[index];
}
return code;
}
}
五.登录界面 LoginJFrame
package com.qi.ui;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
/*
* 创建一个登录界面
* */
public class LoginJFrame extends JFrame implements MouseListener{
//暂时做不了注册功能,因为还没有能力做数据库,所以先创建两个用户测试用
//创建一个集合存储正确的用户名和密码
static ArrayList<User> list = new ArrayList<>();
static{
list.add(new User("zhangsan","123"));
list.add(new User("lisi","1234"));
}
//添加登录按钮
JButton login = new JButton();
//添加注册按钮
JButton register = new JButton();
//添加用户名输入框
JTextField username = new JTextField();
//添加密码输入框
JPasswordField password = new JPasswordField();
//添加验证码输入框
JTextField code = new JTextField();
//定义验证码变量
String codeStr;
//添加验证码变量显示框
JLabel rightCode = new JLabel();
//定义错误显示信息
String error = "用户名或密码错误";
public LoginJFrame() {
//初始化界面
initJFrame();
//在这个界面中添加内容
initView();
//让当前界面显示出来
this.setVisible(true);
}
//初始化界面
private void initJFrame() {
this.setSize(488,435);
//设置窗体的标题
this.setTitle("拼图游戏 V1.0登录");
//设置窗体置顶
this.setAlwaysOnTop(true);
//设置窗体居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消内部默认布局
this.setLayout(null);
}
//在界面中添加内容
//注意:先添加的图片在上方,后添加的图片塞在下面。
private void initView() {
//1.添加用户名文字
JLabel usernameText = new JLabel(new ImageIcon("image\\login\\用户名.png"));
usernameText.setBounds(116,138,51,19);
this.getContentPane().add(usernameText);
//2.设置用户名输入框
// JTextField username = new JTextField();
username.setBounds(195,134,200,30);
this.getContentPane().add(username);
//3.添加密码文字
JLabel passwordText = new JLabel(new ImageIcon("image\\login\\密码.png"));
passwordText.setBounds(130,198,35,18);
this.getContentPane().add(passwordText);
//4.设置密码输入框
// JPasswordField password = new JPasswordField();
password.setBounds(195,195,200,30);
this.getContentPane().add(password);
//5.添加验证码文字
JLabel codeText = new JLabel(new ImageIcon("image\\login\\验证码.png"));
codeText.setBounds(116,256,50,30);
this.getContentPane().add(codeText);
//6.设置验证码输入框
code.setBounds(195,256,100,30);
this.getContentPane().add(code);
//获取验证码:包含字母和一位数字
codeStr = CodeUtil.getCode();
// JLabel rightCode = new JLabel();
//设置内容
rightCode.setText(codeStr);
//位置和宽高
rightCode.setBounds(300,256,50,30);
//添加到界面
this.getContentPane().add(rightCode);
//7.设置登录按钮
login.setBounds(113,310,128,47);
login.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
//去除按钮的默认边框
login.setBorderPainted(false);
//去除按钮的默认背景
login.setContentAreaFilled(false);
this.getContentPane().add(login);
//8.设置注册按钮
register.setBounds(266,310,128,47);
register.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
//去除按钮的默认边框
register.setBorderPainted(false);
//去除按钮的默认背景
register.setContentAreaFilled(false);
this.getContentPane().add(register);
//给登录和注册按钮绑定鼠标事件
login.addMouseListener(this);
register.addMouseListener(this);
//添加背景图片
JLabel background = new JLabel(new ImageIcon("image\\login\\background.png"));
background.setBounds(0, 0, 470, 390);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
//鼠标监听事件
//当单击(按下并释放时)
@Override
public void mouseClicked(MouseEvent e) {
Object obj = e.getSource();
if(obj == login){
//登录按钮被按下,则开始获取输入框中的用户名和密码
//判断1:输入框是否为空,如果为空,提示:用户名和密码为空
String rootUserName = username.getText();
//getPassword()的返回值为char[],直接给转换为字符串
String rootPassWord = new String(password.getPassword());
//获取用户输入的验证码
String rootCode = code.getText();
//判断2:用户名和密码是否为zhangsan,123456,如果正确,则继续判断验证码是否正确
// 如果验证码也正确了,则隐藏登录界面,进入游戏界面
//判断3:用户名和密码如果错误,就展示弹框,提示:用户名和密码错误
//登录成功:true
//登录失败:false
boolean flag = contains(list,rootUserName,rootPassWord,rootCode);
if (flag){
new GameJFrame();
}else{
//创建一个弹框对象JDialog
JDialog jDialog = new JDialog();
jDialog.setTitle("登录失败");
//创建一个管理图片的容器对象JLabel
JLabel jLabelImg = new JLabel(new ImageIcon("image\\damie.jpg"));
//创建一个管理文字的容器对象JLabel
JLabel jLabel = new JLabel(error);
//设置位置和宽高,此时的原点为弹窗的左上角
jLabelImg.setBounds(0, 0, 99, 100);
jLabel.setBounds(22, 130, 120,15);
//把文字和图片添加到弹框当中
jDialog.getContentPane().add(jLabel);
jDialog.getContentPane().add(jLabelImg);
//给弹框设置大小
jDialog.setSize(99, 200);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//让弹框不关闭则无法操作下面的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
//当把弹框收掉的时候,重置用户名,密码,验证码输入框,以便于重新输入
username.setText("");
password.setText("");
code.setText("");
//重新生成验证码
codeStr = CodeUtil.getCode();
rightCode.setText(codeStr);
//刷新一下界面
this.getContentPane().repaint();
}
}else if(obj == register){
new RegisterJFrame();
}
}
//在组件上按下鼠标按钮时调用
@Override
public void mousePressed(MouseEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if(obj == login){
login.setIcon(new ImageIcon("image\\login\\登录按下.png"));
}else if(obj == register){
register.setIcon(new ImageIcon("image\\login\\注册按下.png"));
}
//刷新一下界面
this.getContentPane().repaint();
}
//在组件上释放鼠标按钮时调用
@Override
public void mouseReleased(MouseEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if(obj == login){
login.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
}else if(obj == register){
register.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
}
//刷新一下界面
this.getContentPane().repaint();
}
//当鼠标进入组件时调用
@Override
public void mouseEntered(MouseEvent e) {
}
//当鼠标退出组件时调用
@Override
public void mouseExited(MouseEvent e) {
}
//判断输入的用户名和密码是否存在且正确,验证码是否正确
//存在且正确,且验证码也正确则登录成功:true
//不存在或不正确或验证码不正确则登录失败:false
public boolean contains(ArrayList<User> list,String rootUsername,String Password,String code){
//首先判断验证码是否为空,是否正确
//如果验证码为空,或者不正确,则返回false
if(code.length() == 0 || (!codeStr.equalsIgnoreCase(code))){
error = "验证码不正确";
return false;
}
//到这一步则说明验证码正确
//如果用户名或者密码输入为空,则登录失败
if (rootUsername.length() == 0 || Password.length() == 0){
return false;
}
//获取数组长度
int length = list.size();
for (int i = 0; i < length; i++) {
String listUsername = list.get(i).getUsername();
String listPassword = list.get(i).getPassword();
//如果用户名和密码都匹配且正确,则登录成功
if (listUsername.equalsIgnoreCase(rootUsername) && listPassword.equalsIgnoreCase(Password)){
return true;
};
}
//循环结束,都没有匹配的用户名和密码,则登录失败
return false;
}
}
六.注册界面 RegisterJFame
package com.qi.ui;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
/*
* 创建一个注册界面
* */
public class RegisterJFrame extends JFrame implements MouseListener {
//添加注册按钮
JButton register = new JButton();
//添加重置按钮
JButton reset = new JButton();
//注册用户名输入框
JTextField reUsername = new JTextField();
//注册密码输入框
JPasswordField rePassword = new JPasswordField();
//再次输入密码输入框
JPasswordField vePassword = new JPasswordField();
//定义错误显示信息
String error = "用户已存在";
public RegisterJFrame() {
//初始化界面
initJFrame();
//在这个界面中添加内容
initView();
//让当前界面显示出来
this.setVisible(true);
}
private void initJFrame() {
this.setSize(488,435);
//设置窗体的标题
this.setTitle("拼图 注册");
//设置窗体置顶
this.setAlwaysOnTop(true);
//设置窗体居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
//在这个界面中添加内容
private void initView() {
//1.注册用户名文字
JLabel registerUsername = new JLabel(new ImageIcon("image\\register\\注册用户名.png"));
registerUsername.setBounds(80,138,100,19);
this.getContentPane().add(registerUsername);
//2.注册用户名输入框
reUsername.setBounds(195,134,200,30);
this.getContentPane().add(reUsername);
//3.注册密码文字
JLabel registerPassword = new JLabel(new ImageIcon("image\\register\\注册密码.png"));
registerPassword.setBounds(80,198,100,19);
this.getContentPane().add(registerPassword);
//4.注册密码输入框
rePassword.setBounds(195,194,200,30);
this.getContentPane().add(rePassword);
//5.再次输入密码文字
JLabel verifyPassword = new JLabel(new ImageIcon("image\\register\\再次输入密码.png"));
verifyPassword.setBounds(80,258,100,19);
this.getContentPane().add(verifyPassword);
//6.再次输入密码输入框
vePassword.setBounds(195,254,200,30);
this.getContentPane().add(vePassword);
//7.设置注册按钮
register.setBounds(113,310,128,47);
register.setIcon(new ImageIcon("image\\register\\注册按钮.png"));
//去除按钮的默认边框
register.setBorderPainted(false);
//去除按钮的默认背景
register.setContentAreaFilled(false);
this.getContentPane().add(register);
//8.设置重置按钮
reset.setBounds(266,310,128,47);
reset.setIcon(new ImageIcon("image\\register\\重置按钮.png"));
//去除按钮的默认边框
reset.setBorderPainted(false);
//去除按钮的默认背景
reset.setContentAreaFilled(false);
this.getContentPane().add(reset);
//给注册和重置按钮绑定鼠标事件
register.addMouseListener(this);
reset.addMouseListener(this);
//添加背景图片
JLabel background = new JLabel(new ImageIcon("image\\register\\background.png"));
background.setBounds(0, 0, 470, 390);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
//鼠标监听事件
//当单击(按下并释放时)
@Override
public void mouseClicked(MouseEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if (obj == register){
String name = reUsername.getText();
String password = new String(rePassword.getPassword());
String againPassword = new String(vePassword.getPassword());
boolean flag = contains(LoginJFrame.list,name,password,againPassword);
//如果注册成功
if (flag){
NewUser(name,password);
//创建一个弹框对象JDialog
JDialog jDialog = new JDialog();
jDialog.setTitle("注册成功");
//给弹框设置大小
jDialog.setSize(100, 100);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//让弹框不关闭则无法操作下面的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
//刷新一下界面
this.getContentPane().repaint();
new LoginJFrame();
}else{
//创建一个弹框对象JDialog
JDialog jDialog = new JDialog();
jDialog.setTitle("注册失败");
//创建一个管理文字的容器对象JLabel
JLabel jLabel = new JLabel(error);
jLabel.setBounds(50, 130, 120,15);
//把文字和图片添加到弹框当中
jDialog.getContentPane().add(jLabel);
//给弹框设置大小
jDialog.setSize(260, 200);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//让弹框不关闭则无法操作下面的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
//当把弹框收掉的时候,重置用户名,密码,验证码输入框,以便于重新输入
reUsername.setText("");
rePassword.setText("");
vePassword.setText("");
//刷新一下界面
this.getContentPane().repaint();
}
}else if(obj == reset){
//重置按钮被点击
reUsername.setText("");
rePassword.setText("");
vePassword.setText("");
}
//刷新一下界面
this.getContentPane().repaint();
}
//在组件上按下鼠标按钮时调用
@Override
public void mousePressed(MouseEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if (obj == register){
register.setIcon(new ImageIcon("image\\register\\注册按下.png"));
}else if(obj == reset){
reset.setIcon(new ImageIcon("image\\register\\重置按下.png"));
}
//刷新一下界面
this.getContentPane().repaint();
}
//在组件上释放鼠标按钮时调用
@Override
public void mouseReleased(MouseEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
if (obj == register){
register.setIcon(new ImageIcon("image\\register\\注册按钮.png"));
}else if(obj == reset){
reset.setIcon(new ImageIcon("image\\register\\重置按钮.png"));
}
//刷新一下界面
this.getContentPane().repaint();
}
//当鼠标进入组件时调用
@Override
public void mouseEntered(MouseEvent e) {
}
//当鼠标退出组件时调用
@Override
public void mouseExited(MouseEvent e) {
}
//判断输入的用户名和密码是否已存在
//不存在或存在不匹配,注册成功:true
// 都已存在且匹配或两次密码不一致,注册失败:false
public boolean contains(ArrayList<User> list, String rootUsername, String Password,String againPassword){
//如果用户名或者两次密码中有输入为空,则登录失败
if (rootUsername.length() == 0 || Password.length() == 0 || againPassword.length() == 0){
error = "请输入数据";
return false;
}
//判断两次输入的密码是否一致
if(!(Password.equalsIgnoreCase(againPassword))){
error = "两次输入密码不一致,请重新输入";
return false;
}
//到这里说明两次密码输入是一致的
//获取数组长度
int length = list.size();
for (int i = 0; i < length; i++) {
String listUsername = list.get(i).getUsername();
String listPassword = list.get(i).getPassword();
//如果用户名和密码都匹配且正确,则表示用户已存在
if (listUsername.equalsIgnoreCase(rootUsername) && listPassword.equalsIgnoreCase(Password)){
return false;
};
}
//循环结束,都没有匹配的用户名和密码,则注册成功
return true;
}
//给集合添加用户数据
public void NewUser(String username,String password){
User user = new User(username,password);
LoginJFrame.list.add(user);
}
}