JAVA练习题37:拼图小游戏

第一个小项目:拼图小游戏
暂不完善,因为没有链接数据库,用户名和密码只是暂存在集合中

资料

图片资料
整个项目源码

界面展示

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

代码:

一.主程序(入口)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);
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值