Java原生代码编写一个拼图小游戏项目:JFrame

1.项目介绍和页面搭建

  1. 使用IDEA创建一个空白java项目名为puzzlegame
  2. 在src下面创建包:edu.swpu.ui,新建三个类,分贝实现主界面,登录界面,注册界面

主界面GameJFrame源码:

//创建一个主界面
public class GameJFrame extends JFrame {

    public GameJFrame(){
        this.setSize(603,680);
        this.setVisible(true);
    }
}

登录界面  LoginJFrame源码:

//登录界面
public class LoginJFrame extends JFrame {

    public LoginJFrame(){
        this.setSize(488,433);
        this.setVisible(true);
    }
}

注册界面  RegisterJFrame源码:

//注册界面
public class RegisterJFrame extends JFrame {

    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
    }
}

3.在src目录下创建一个主程序运行入口APP,源码如下(简单调用以上三个界面):

public class App {
    public static void main(String[] args) {
        new LoginJFrame();
        new GameJFrame();
        new RegisterJFrame();
    }
}

2.界面设置和菜单搭建

1.IDEA抽取方法快捷键:ctrl+alt+m

2.首先初始界面,设置标题,置顶,居中,关闭模式

3.设置菜单(JMenu),分别创建主菜单对象,选项对象,条目对象,层层封装

GameJFrame实现初始化界面和初始化菜单,源码更新为:

//创建一个主界面
public class GameJFrame extends JFrame {

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //让界面显示
        this.setVisible(true);
    }


    private void initJMenuBar() {
        JMenuBar jMenuBar = new JMenuBar();

        //创建两个菜单选项的对象
        JMenu functionJmMnu = new JMenu("功能");
        JMenu aboutJmMnu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //将每个条目添加到选项中
        functionJmMnu.add(replayItem);
        functionJmMnu.add(reLoginItem);
        functionJmMnu.add(closeItem);
        aboutJmMnu.add(accountItem);

        //将选项添加到菜单中
        jMenuBar.add(functionJmMnu);
        jMenuBar.add(aboutJmMnu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式
    }
}

LoginJFrame和RegisterJFrame暂时只需要实现初始化界面即可,此处略

3.添加图片

1.添加素材包image在项目下

Java原生代码编写一个拼图小游戏项目:JFrame_第1张图片

 2.在初始化菜单后面添加初始化图片方法:initImage();

实现将15张图片放入注界面。

    private void initImage() {
        int number = 1;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                //创建一个图片ImageIcon的对象
                //创建一个JLable的对象
                JLabel jLabel = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\animal\\animal3\\"+number+".jpg"));
                //指定图片位置
                jLabel.setBounds(105 * j, 105 * i, 105, 105);
                //将管理容器添加到界面
                this.getContentPane().add(jLabel);
                number++;
            }
        }
    }

在初始化主界面方法initJFrame()中添加一段代码:取消图片默认居中

 //取消默认的居中放置
        this.setLayout(null);

4.打乱图片

1.在初始化菜单后面添加一个初始化数据方法initData();得到一个数据打乱的二维数组,作为调取图片的索引。

private void initData() {
        int[] tempArr = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        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;
        }

        for (int i = 0; i < tempArr.length; i++) {
            data[i / 4][i % 4] = tempArr[i];
        }

    }

2.对initImage()方法进行修改:

    private void initImage() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                //创建一个图片ImageIcon的对象
                //创建一个JLable的对象
                JLabel jLabel = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\animal\\animal3\\" + num  + ".jpg"));
                //指定图片位置
                jLabel.setBounds(105 * j, 105 * i, 105, 105);
                //将管理容器添加到界面
                this.getContentPane().add(jLabel);

            }
        }
    }

 可以在注界面查看到被打乱的图片。

5.事件

介绍以下三种监听方式(分别描述了示例代码,不是项目内容):

  • ActionListener(动作监听)

public class MyJFrame extends JFrame implements ActionListener {
    JButton jtb1 = new JButton("点我");
    JButton jtb2 = new JButton("点我");
    public MyJFrame(){
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式

        //取消默认的居中放置
        this.setLayout(null);


        //设置宽高
        jtb1.setBounds(0,0,100,50);
        jtb1.addActionListener(this);


        //设置宽高
        jtb2.setBounds(100,0,100,50);
        jtb2.addActionListener(this);

        this.getContentPane().add(jtb1);
        this.getContentPane().add(jtb2);


        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();

        if (source == jtb1){
            jtb1.setSize(200,200);
        }else if (source== jtb2){
            Random r = new Random();
            jtb2.setLocation(r.nextInt(500),r.nextInt(500));
        }
    }
}
  • MouseListener(鼠标监听)
public class MyJFrame2 extends JFrame implements MouseListener {
    JButton jtb1 = new JButton("点我");
    JButton jtb2 = new JButton("点我");
    public MyJFrame2(){
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式

        //取消默认的居中放置
        this.setLayout(null);


        //设置宽高
        jtb1.setBounds(0,0,100,50);
        jtb1.addMouseListener(this);



        //设置宽高
        jtb2.setBounds(100,0,100,50);


        this.getContentPane().add(jtb1);
        this.getContentPane().add(jtb2);


        this.setVisible(true);
    }


    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("单击");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("按住");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("松开");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("划入");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("划出");
    }
}
  • KeyListener(键盘监听)
public class MyJFrame3 extends JFrame implements KeyListener {

    public MyJFrame3(){
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式

        //取消默认的居中放置
        this.setLayout(null);
        this.addKeyListener(this);
        this.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("按下");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("松开");
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 65){
            System.out.println("现在按的是A");
        }
    }
}

6.美化界面

1.将15张小图片移动到界面的中央偏下方

2.添加了背景图片

3.添加了图片的边框

4.优化路径,由绝对路径改成了相对路径

只对initImage()方法进行了修改

    private void initImage() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                //创建一个图片ImageIcon的对象
                //创建一个JLable的对象
                JLabel jLabel = new JLabel(new ImageIcon("..\\puzzlegame\\image\\animal\\animal3\\" + num  + ".jpg"));
                //指定图片位置
                jLabel.setBounds(105 * j+83, 105 * i+134, 105, 105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //将管理容器添加到界面
                this.getContentPane().add(jLabel);

            }
        }
        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("..\\puzzlegame\\image\\background.png"));
        background.setBounds(40,40,508,560);
        //添加背景图到界面
        this.getContentPane().add(background);
    }

目前的效果图:

Java原生代码编写一个拼图小游戏项目:JFrame_第2张图片

7.移动图片

1.在GameJFrame类中实现KeyListener接口,并重写所有抽象方法。

2.给界面添加键盘监听事件

3.统计下空白方块0在二维数组中的位置

4.在keyReleased方法中实现移动的逻辑

GameJFrame类更新为:

//创建一个主界面
public class GameJFrame extends JFrame implements KeyListener {

    //创建二维数组
    int[][] data = new int[4][4];
    //空白方块的位置
    int x = 0;
    int y = 0;

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱)
        initData();

        //初始化图片
        initImage();

        //让界面显示
        this.setVisible(true);
    }


    private void initData() {
        int[] tempArr = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        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;
        }

        for (int i = 0; i < tempArr.length; i++) {
            if (tempArr[i] == 0) {
                x = i / 4;
                y = i % 4;
            } else {
                data[i / 4][i % 4] = tempArr[i];
            }
        }

    }

    private void initImage() {
        //清除所有图片
        this.getContentPane().removeAll();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                //创建一个图片ImageIcon的对象
                //创建一个JLable的对象
                JLabel jLabel = new JLabel(new ImageIcon("..\\puzzlegame\\image\\animal\\animal3\\" + num + ".jpg"));
                //指定图片位置
                jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //将管理容器添加到界面
                this.getContentPane().add(jLabel);

            }
        }
        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("..\\puzzlegame\\image\\background.png"));
        background.setBounds(40, 40, 508, 560);
        //添加背景图到界面
        this.getContentPane().add(background);

        //刷新界面
        this.getContentPane().repaint();
    }


    private void initJMenuBar() {
        JMenuBar jMenuBar = new JMenuBar();

        //创建两个菜单选项的对象
        JMenu functionJmMnu = new JMenu("功能");
        JMenu aboutJmMnu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //将每个条目添加到选项中
        functionJmMnu.add(replayItem);
        functionJmMnu.add(reLoginItem);
        functionJmMnu.add(closeItem);
        aboutJmMnu.add(accountItem);

        //将选项添加到菜单中
        jMenuBar.add(functionJmMnu);
        jMenuBar.add(aboutJmMnu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式

        //取消默认的居中放置
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode==37){
            System.out.println("向左移动");
            if (y==3){
                return;
            }
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            initImage();
        } else if (keyCode==38) {
            System.out.println("向上移动");
            if (x==3){
                return;
            }

            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            initImage();
        }else if (keyCode==39) {
            System.out.println("向右移动");
            if (y==0){
                return;
            }

            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            initImage();
        }else if (keyCode==40) {
            System.out.println("向下移动");
            if (x==0){
                return;
            }

            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            initImage();
        }
    }
}

8.查看完整图片,作弊码和判断胜利

1.查看完整图片,通过重写keyPressed()方法,写入监听事件:当长按A时,显示完整图片

2.作弊码:在keyReleased()方法中重写,当按下W键时,将正确的二维数组的坐标赋值给data.

3.判断胜利:新增了一个victory()方法,判断当前数组的坐标和胜利数组win的坐标是否一致。

更新后的GameJFrame类为:

//创建一个主界面
public class GameJFrame extends JFrame implements KeyListener {

    //创建二维数组
    int[][] data = new int[4][4];
    //空白方块的位置
    int x = 0;
    int y = 0;
    //定义一个变量,记录当前图片的路径
    String path = "..\\puzzlegame\\image\\animal\\animal3\\";

    int[][] win = new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱)
        initData();

        //初始化图片
        initImage();

        //让界面显示
        this.setVisible(true);
    }


    private void initData() {
        int[] tempArr = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        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;
        }

        for (int i = 0; i < tempArr.length; i++) {
            if (tempArr[i] == 0) {
                x = i / 4;
                y = i % 4;
            } else {
                data[i / 4][i % 4] = tempArr[i];
            }
        }

    }

    private void initImage() {
        //清除所有图片
        this.getContentPane().removeAll();

        if (victory()){
        //显示胜利
            JLabel winJLabel = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\win.png"));
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                //创建一个图片ImageIcon的对象
                //创建一个JLable的对象
                JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
                //指定图片位置
                jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //将管理容器添加到界面
                this.getContentPane().add(jLabel);

            }
        }
        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("..\\puzzlegame\\image\\background.png"));
        background.setBounds(40, 40, 508, 560);
        //添加背景图到界面
        this.getContentPane().add(background);

        //刷新界面
        this.getContentPane().repaint();
    }


    private void initJMenuBar() {
        JMenuBar jMenuBar = new JMenuBar();

        //创建两个菜单选项的对象
        JMenu functionJmMnu = new JMenu("功能");
        JMenu aboutJmMnu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //将每个条目添加到选项中
        functionJmMnu.add(replayItem);
        functionJmMnu.add(reLoginItem);
        functionJmMnu.add(closeItem);
        aboutJmMnu.add(accountItem);

        //将选项添加到菜单中
        jMenuBar.add(functionJmMnu);
        jMenuBar.add(aboutJmMnu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        this.setTitle("拼图单机版 v1.0");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式

        //取消默认的居中放置
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松时调用
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode==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("..\\puzzlegame\\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;
        }

        int keyCode = e.getKeyCode();
        if (keyCode==37){
            System.out.println("向左移动");
            if (y==3){
                return;
            }
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            initImage();
        } else if (keyCode==38) {
            System.out.println("向上移动");
            if (x==3){
                return;
            }

            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            initImage();
        }else if (keyCode==39) {
            System.out.println("向右移动");
            if (y==0){
                return;
            }

            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            initImage();
        }else if (keyCode==40) {
            System.out.println("向下移动");
            if (x==0){
                return;
            }

            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            initImage();
        }else if (keyCode==65){
            initImage();
        }else if(keyCode==87){
            data = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            initImage();
        }
    }

    //判断胜利
    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]){
                    return false;
                }
            }
        }
        return true;
    }
}

9.计步和菜单业务实现

1.计步,设置一个全局变量step,在图片移动模块中计步,在

 if (keyCode==37){
            System.out.println("向左移动");
            if (y==3){
                return;
            }
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;

            //计步器
            step++;
            initImage();
        } 

在initImage中添加计步显示:

        JLabel stepCount = new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);

2.菜单业务实现:

  1. 实现ActionListener接口,重写点击事件
  2. 将initJMenuBar中创建的四个条目对象提出到全局变量
     //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");
    
        JMenuItem accountItem = new JMenuItem("公众号");

3.给条目绑定事件

        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);

4. 在重写的actionPerformed()中分别实现重新游戏,重新登录,关闭游戏,关于我们的业务功能。(修复bug:在initData方法中,对空白块的数值录入的零坐标的覆盖)

   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 == accountItem){
            System.out.println("公众号");
            //创建一个弹框对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器对象JLabel
            JLabel jLabel = new JLabel(new ImageIcon("..\\puzzlegame\\image\\about.png"));
            //设置位置和宽高
            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 == closeItem){
            System.out.println("关闭游戏");
            //关闭虚拟机即可
            System.exit(0);
        }
    }

10项目思路分析

  1. 在上面我们已经实现了游戏主界面的搭建,实现了游戏运行逻辑,更换图片,重新登录,关闭游戏,重新游戏,弹框等功能。
  2. 接下来我们要实现的是登录界面的功能实现:
  3. 首先创建一个JAVABeam:User,设置两个成员变量:username,password,使用Arraylist集合创建user集合,添加几个user测试用户。
  4. 在LoginJFrame的构造方法中初始化界面(initJFrame),初始化内容(initVIew),再显示界面
  5. LoginJFrame类实现接口MouseListener,重写事件方法,并事件绑定按钮。
  6. 在initVeiw()方法中,设置了用户名文字,用户输入框,密码文字,密码输入框,验证码文字,新增生成随机验证码方法codeStr,验证码输入框,登录按钮,注册按钮以及背景图片。
  7. 新增弹框方法:showDialog():输入一段文字后弹框显示。(用于用户交互界面)
  8. 重写mousePressed()方法:按住注册,登录按钮时,按钮颜色加深。
  9. 重写mouseReleased()方法:松开注册按钮时,按钮颜色恢复
  10. 重写mouseClicked()方法:设置了三个点击事件:第一,点击登录按钮时,判断用户密码,验证码是否正确;第二,点击验证码时,更新验证码信息;第三,点击注册界面时,跳转注册界面。

LoginJFrame类的完整代码:

//登录界面
public class LoginJFrame extends JFrame implements MouseListener {

    //创建用户
    static ArrayList list = new ArrayList();

    static {
        list.add(new User("张三", "123"));
        list.add(new User("李四", "1234"));
    }

    //登录
    JButton login = new JButton();
    //添加用户户名输入框
    JTextField username = new JFormattedTextField();
    //密码输入框
    JPasswordField password = new JPasswordField();
    //验证码输入框
    JTextField code = new JFormattedTextField();
    //正确验证码
    String codeStr = CodeUtil.getCode();
    //正确验证码模块
    JLabel rightCode = new JLabel();
    //5.添加注册按钮
    JButton register = new JButton();


    public LoginJFrame() {
        //初始化界面
        initJFrame();

        //在界面添加内容
        initView();


        this.setVisible(true);
    }

    private void initView() {
        //添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\用户名.png"));
        usernameText.setBounds(116, 135, 47, 17);
        this.getContentPane().add(usernameText);


        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);

        //添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\密码.png"));
        passwordText.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordText);

        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //验证码提示
        JLabel codeText = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\验证码.png"));
        codeText.setBounds(133, 256, 50, 30);
        this.getContentPane().add(codeText);


        code.setBounds(195, 256, 100, 30);
        this.getContentPane().add(code);


        //设置内容
        rightCode.setText(codeStr);
        //设置宽高
        rightCode.setBounds(300, 256, 50, 30);
        //添加到界面
        this.getContentPane().add(rightCode);
        //添加刷新验证码
        rightCode.addMouseListener(this);

        //5.设置登录按钮n

        login.setBounds(123, 310, 128, 47);
        login.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\登录按钮.png"));
        //去除按钮的边框
        login.setBorderPainted(false);
        //去除按钮的背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);

        //添加点击事件
        login.addMouseListener(this);


        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\注册按钮.png"));

        //去除按钮的边框
        register.setBorderPainted(false);
        //去除按钮的背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);

        //添加点击事件
        register.addMouseListener(this);

        //7.添加背景图片
        JLabel background = new JLabel(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);


    }

    private void initJFrame() {
        this.setSize(488, 430);
        this.setTitle("拼图 注册");//设置界面的标题
        this.setAlwaysOnTop(true);//置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭模式
        this.setLayout(null);//取消默认布局
    }

    public void showJDialog(String content) {
        //创建对象
        JDialog jDialog = new JDialog();
        //设置大小
        jDialog.setSize(200, 200);
        //置顶
        jDialog.setAlwaysOnTop(true);
        //居中
        jDialog.setLocationRelativeTo(null);
        //锁定
        jDialog.setModal(true);

        //创建警告文字对象
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 200);
        jDialog.getContentPane().add(warning);

        //让弹框展示
        jDialog.setVisible(true);
    }

    private boolean contains(ArrayList list,User user) {
        for (int i = 0; i < list.size(); i++) {
            User user1 = list.get(i);
            if ((user1.getUsername().equals(user.getUsername())) && (user1.getPassword().equals(user.getPassword()))) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        Object obj = e.getSource();
        if (obj == login) {
            String usernameText = username.getText();
            String passwordText = password.getText();
            User userInput = new User(usernameText,passwordText);
            String codeText = code.getText();
            if (usernameText.isEmpty() || passwordText.isEmpty()) {
                showJDialog("用户名或密码为空!!!");
            } else {
                if (codeText.equalsIgnoreCase(codeStr)){
                    if (contains(list,userInput)){
                        System.out.println("success");
                            this.setVisible(false);
                            new GameJFrame();
                    }else {
                        showJDialog("用户名不存在!");
                    }
                }else {
                    showJDialog("验证码错误!");

                }
            }
        }else if (obj == rightCode){
            System.out.println("更新验证码");
            codeStr = CodeUtil.getCode();
            //设置内容
            rightCode.setText(codeStr);
        }else if (obj == register){
            showJDialog("当前不支持注册!但提供测试账号:张三,密码:123");
//            new RegisterJFrame();
        }
    }

    //按下不松
    @Override
    public void mousePressed(MouseEvent e) {
        Object click = e.getSource();
        if (click == login) {
            login.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\登录按下.png"));
        }else if (click == register){
            register.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\注册按下.png"));
        }
    }

    //松开
    @Override
    public void mouseReleased(MouseEvent e) {
        Object click = e.getSource();
        if (click == login) {
            login.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\登录按钮.png"));
        }else if (click == register){
            register.setIcon(new ImageIcon("G:\\JavaReview\\puzzlegame\\image\\login\\注册按钮.png"));
        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

11.游戏打包exe安装包

使用IDEA签名打包即可

12.APP效果展示

  1. 主界面展示Java原生代码编写一个拼图小游戏项目:JFrame_第3张图片
  2. 更换图片展示Java原生代码编写一个拼图小游戏项目:JFrame_第4张图片
  3. 登录界面显示Java原生代码编写一个拼图小游戏项目:JFrame_第5张图片
  4. 用户交互界面展示

Java原生代码编写一个拼图小游戏项目:JFrame_第6张图片

你可能感兴趣的:(项目管理,java,intellij-idea,ui,游戏程序,jvm)