java拼图游戏(未补全)

本文介绍了使用Java Swing创建GUI应用的基本步骤,包括创建主界面、制作菜单、添加图片、处理事件(如鼠标监听和键盘监听)以及界面美化。通过示例展示了如何实现图片显示、按钮响应以及键盘事件的监听,特别是详细讲解了如何在界面中添加和移动图片,以及如何在按下特定键(如A键)时显示完整图片。此外,还涵盖了游戏界面的布局和数据管理,以及如何实现图片的打乱和移动。
摘要由CSDN通过智能技术生成

未完成项目…一直没空写

1. 创建主界面


2. 菜单制作

请添加图片描述

3. 添加图片

JLabel管理区域:文字、图片
管理图片时,可以对图片的边框、宽高、位置进行设置
步骤:

  1. 先创建一个ImageIcon对象,并指定图片的位置
  2. 再创建一个JLabel对象,把图片交给JLabel
  3. 再把这个整体放到界面当中

4. 事件

事件源:按钮、图片、窗体
事件:某些操作,如:鼠标单击、鼠标划入
绑定事件:当事件源上发生了某个事件,则执行某段代码
例如:点击“登录”按钮会,会发生校验用户名和密码的事件
分类:键盘监听KeyListener、鼠标监听MouseListener、动作监听ActionListener
鼠标监听

public class MouseLis extends JFrame implements MouseListener {
    //创建一个按钮对象
    JButton jbt1 = new JButton("按钮1");
    public MouseLis(){
        this.setSize(603, 680);
        this.setTitle("测试鼠标点击事件");
        this.setAlwaysOnTop(true);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setLayout(null);

        jbt1.setBounds(0, 0, 100, 50);

        //给按钮绑定鼠标事件
        jbt1.addMouseListener(this);

        this.getContentPane().add((jbt1));

        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("鼠标划出");
    }
}

键盘监听

public class KeyLis extends JFrame implements KeyListener {

    public KeyLis(){
        this.setSize(603,680);
        this.setTitle("测试鼠标点击事件");
        this.setAlwaysOnTop(true);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setLayout(null);

        //给整个窗体添加键盘监听
        //调用者this:本类对象,当前的界面对象,表示我要给整个界面添加监听
        //addKeyListener: 表示要给本界面键盘监听
        //参数this:当事件被触发之后,会执行本类中的对应代码
        this.addKeyListener(this);

        this.setVisible(true);
        }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    //细节1:如果按下一个按键没有松开,那么会重复的去调用keyPressed方法
    //细节2:键盘里那么多按键,如何进行区分?
    //每一个按键都有一个编号与之对应
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("按下不松");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("松开按键");
        //获取键盘上每一个按键的编号
        int code = e.getKeyCode();
        if(code == 65){
            System.out.println("现在按的是A");
        } else if(code == 66){
            System.out.println("现在按的是B");
        }
    }
}

5. 美化界面

6. 向上移动

上移:把空白方块下方的图片上移

7. 看完整图片

按住A,显示完整图片
松开A,显示打乱图片

代码

app.java

public class App {
    public static void main(String[] args) {
        //App表示程序的启动入口

        //如果我们想要开启一个界面,就创建谁的对象就可以了
        new LoginJFrame();//创造了一个界面
        new GameJFrame();
        new RegisterJFrame();
    }
}
package com.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {

    //创建一个二维数组,目的:用来管理数据
    //加载图片的时候,会根据二维数组
    //写在方法外面,是因为在initData()和initImage()中都会用到
    int[][] data = new int[4][4];
    //记录空白方块在二维数组中的位置
    int x = 0;
    int y = 0;
    //定义一个变量,记录当前展示图片的路径
    String path = "image/touxiang/";

    //JFrame表示:界面、窗体,那么子类也表示界面、窗体
    //这个界面是游戏的主界面
    //以后跟登录界面相关的所有代码,都写在这里
    public GameJFrame()
    {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

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

        //初始化图片(根据打乱后的 结果/二维数组 加载图片)
        initImage();

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

    //数据打乱
    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;
        }

        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的对象
                //创建一个JLabel的对象(管理容器),将ImageIcon放入JLabel中
                JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
                //指定图片的位置
                jLabel.setBounds(105 * i + 83, 105 * j + 104, 105, 105);
                //给图片添加边框
                //RAISED: 表示让图片凸起来,LOWERED:表示让图片凹下去
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //把管理容器添加到界面
                this.getContentPane().add(jLabel);
            }
        }
        //添加背景图片
        JLabel jLabel = new JLabel(new ImageIcon("image/background/0.jpeg"));
        jLabel.setBounds(40,40,508,560);
        //把背景图片添加到界面当中
        this.getContentPane().add(jLabel);

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

    private void initJFrame(){
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题标题
        this.setTitle("拼图");
        //设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
        this.setAlwaysOnTop(true);
        //设置界面打开时居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        //取消默认的居中方式
        this.setLayout(null);

        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    //在游戏窗口的上方添加菜单
    private void initJMenuBar(){
        //初始化菜单
        //创建整个的菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象(功能、关于我们)
        JMenu funtionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

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

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

        //将每一个选项下面的条目添加到选项中
        funtionJMenu.add(replyItem);
        funtionJMenu.add(reLoginItem);
        funtionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

        //将菜单里的两个选项加入到菜单中
        jMenuBar.add(funtionJMenu);
        jMenuBar.add(aboutJMenu);

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

    @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("image/background/1.jpeg"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //加载背景图片
            JLabel bg = new JLabel(new ImageIcon("image/background/2.jpeg"));
            bg.setBounds(40,40,508,560);
            this.getContentPane().add(bg);
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //对左(37)、上(38)、右(39)、下(40)进行判断
        int code = e.getKeyCode();
        if(code == 37){
            if(x == 0){
                return;
            }
            System.out.println("向左移动");
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            initImage();
        } else if (code == 38) {
            if(y == 0){
                return;
            }
            System.out.println("向上移动");
            //x, y空白方块,x+1, y空白方块下方的数字
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            //调用方法按照最新的数字加载图片
            initImage();
        } else if (code == 39) {
            if(x == 3){
                return;
            }
            System.out.println("向右移动");
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            initImage();
        } else if (code == 40) {
            if(y == 3){
                return;
            }
            System.out.println("向下移动");
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            initImage();
        } else if (code == 65) {
            initImage();
        }
    }
}
public class LoginJFrame extends JFrame {
    //LoginJFrame 表示登录界面
    //以后所有跟登录相关的代码,都写在这里

    //写一个构造方法,创造界面时,给界面进行初始化
    //在创建登录界面的时候,同时给这个界面去设置一些信息
    //比如,宽高、展示...
    public LoginJFrame(){
        //this表示的是在App.java的主函数中创建的对象,给那个对象设置宽高...
        this.setSize(488, 430);
        //设置界面的标题标题
        this.setTitle("登录界面");
        //设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
        this.setAlwaysOnTop(true);
        //设置界面打开时居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //让界面显示
        this.setVisible(true);
    }
}
public class RegisterJFrame extends JFrame {
    //跟注册相关的代码都写在这里
    public RegisterJFrame()
    {
        this.setSize(488, 500);
        //设置界面的标题标题
        this.setTitle("注册界面");
        //设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
        this.setAlwaysOnTop(true);
        //设置界面打开时居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //让界面显示
        this.setVisible(true);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值