# 事件

# 键盘事件

package event;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class main {
    public static void main(String[] args) {
        new GameJFram();
    }
}

class GameJFram extends JFrame implements KeyListener {
    public GameJFram() {
        this.setTitle("键盘事件");
        this.setSize(400, 400);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //给整个窗体添加键盘监听
        //调用者this:本类对象,当前界面的对象 表示我要给整个界面添加监听
        //addKeyListener(KeyListener l)//表示要给本界面添加键盘监听
        //参数this:表示当事件触发后 会执行本类中的对应代码
        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("键盘松开事件");
    }
}

# 按钮事件

package event;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

//按钮动作监听
public class ActionLister {
    public static void main(String[] args) {
        new Action();
    }
}

class Action extends JFrame {
    //添加按钮
    JButton jButton = new JButton("按钮");

    public Action() {
        this.setTitle("按钮事件");
        this.setSize(400, 400);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中放置
        this.setLayout(null);

        //设置按钮位置大小
        jButton.setBounds(100, 100, 100, 100);
        //给按钮添加点击事件
        //调用者jButton:按钮对象, 表示我要给该按钮添加键盘监听事件
        //addActionListener(KeyListener l)//表示要给按钮添加按下监听
        //参数this:表示当事件触发后 会执行本类中的对应代码 actionPerformed
        //匿名内部类
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("按钮点击");
                //随机让按钮改变位置
                Random random = new Random();
                int x = random.nextInt(300);
                int y = random.nextInt(300);
                jButton.setLocation(x, y);
            }
        });
        //将按钮添加入窗体中
        this.getContentPane().add(jButton);
        this.setVisible(true);
    }
}

# 鼠标监听

上述讲过actionListener后如果想监听一个鼠标的单击事件,有几种方式

  1. 通过actionListener进行动作监听
  2. 鼠标监听中的单击事件
  3. 鼠标监听中的双击事件

# 方法一 使用匿名内部类

package event;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class mouseListener {
    public static void main(String[] args) {
        new mouseLister();
    }
}

class mouseLister extends JFrame {
    //创建按钮对象
    JButton jb = new JButton("按钮");

    public mouseLister() {
        //设置界面标题
        setTitle("鼠标事件监听");
        //设置界面大小
        setSize(400, 300);
        //设置默认居中
        this.setLocationRelativeTo(null);
        //设置关闭方式
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //取消默认居中放置
        setLayout(null);
        //设置按钮位置
        jb.setBounds(100, 100, 100, 50);
        //将按钮添加到整个的页面当中
        this.getContentPane().add(jb);
        //给按钮绑定鼠标事件
        jb.addMouseListener(new MouseListener() {
            @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("鼠标划出事件");
            }
        });
        //设置界面可见
        setVisible(true);
    }
}

# 方法二 使用接口

package event;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class mouseListener {
    public static void main(String[] args) {
        new mouseLister();
    }
}

class mouseLister extends JFrame implements MouseListener {
    //创建按钮对象
    JButton jb = new JButton("按钮");

    public mouseLister() {
        //设置界面标题
        setTitle("鼠标事件监听");
        //设置界面大小
        setSize(400, 300);
        //设置默认居中
        this.setLocationRelativeTo(null);
        //设置关闭方式
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //取消默认居中放置
        setLayout(null);
        //设置按钮位置
        jb.setBounds(100, 100, 100, 50);
        //将按钮添加到整个的页面当中
        this.getContentPane().add(jb);


        //给按钮绑定鼠标事件 
        //使用接口实现方法
        jb.addMouseListener(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("鼠标离开事件");
    }
}

# mouseListener方法摘要

| 方法名 | 说明 | |------------------------------------|-----------------------| | void mouseClicked(MouseEvent e) | 在组件上单击(按下并释放),鼠标按钮时调用 | | void mousePressed(MouseEvent e) | 在组件上单击(按下),鼠标按钮时调用 | | void mouseReleased(MouseEvent e) | 在组件上释放鼠标按钮时调用 | | void mouseEntered(MouseEvent e) | 鼠标进入组件时调用 | | void mouseExited(MouseEvent e) | 鼠标离开组件时调用 |

# 键盘监听机制

keyListener

# 方法摘要

方法名 说明
void keyTyped(KeyEvent e) 键入建时调用
void keyReleased(KeyEvent e) 释放键时调用
void keyPressed(KeyEvent e) 按下键时调用 按下不松会反复进行调用
package event;

import javax.swing.*;
import java.awt.event.KeyEvent;

public class KeyListener {
    public static void main(String[] args) {
        new keyLister();
    }
}

class keyLister extends JFrame {

    public keyLister() {
        //设置窗体标题
        setTitle("keyListener");
        //设置窗体大小
        setSize(300, 300);
        //取消元素默认居中
        setLocationRelativeTo(null);
        //设置窗体关闭模式
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        //设置键盘监听
        this.addKeyListener(new java.awt.event.KeyListener() {
            //键盘任意键按下
            @Override
            public void keyTyped(KeyEvent e) {
                System.out.print("键盘任意键按下");
                System.out.println(e);
            }

            //按下键时调用
            //按下不松会反复进行调用
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.print("按下键时调用");
                System.out.println(e);
            }

            //释放键时调用
            @Override
            public void keyReleased(KeyEvent e) {
                System.out.print("释放键时调用");
                System.out.println(e);
            }
        });
        //设置窗体可见
        setVisible(true);
    }
}

# 拼图小游戏 主窗体部分代码

package qranqi.ui;

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

public class GameJFram extends JFrame {
    //完成的数组
    final int[][] finallList = new int[][]{
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 0}
    };
    //窗体大小
    int width = 0;
    int height = 0;
    //创建一个二维数组 4*4
    int[][] list = new int[3][3];
    //记录0的位置
    int x = 0;
    int y = 0;
    //步数
    int step = 0;

    //游戏主入口界面
    public GameJFram(String title, int width, int height) {
        this.width = width;
        this.height = height;
        initJFram(title, width, height);
        //设置导航条
        setMneuBar();
        //初始化数组
        initData();
        //初始化图片
        initImages();
        //给界面添加键盘监听
        initKeyListener();

        //界面显示 建议写到最后
        setVisible(true);
    }

    //加载二维数组
    private void initData() {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 0};
        Random random = new Random();
        //打乱数组
        for (int i = 0; i < arr.length; i++) {
            int index = random.nextInt(arr.length);
            //两值交换
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        //将打乱后的数据放入二维数组中
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                x = i / 3;
                y = i % 3;
            }
            list[i / 3][i % 3] = arr[i];
        }

    }

    //加载图片
    private void initImages() {
        //清空已经加载的图片
        this.getContentPane().removeAll();
        //设置统计步数
        JLabel labelText = new JLabel("步数:" + step);
        labelText.setBounds(0, 0, 100, 40);
        this.getContentPane().add(labelText);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                //创建一个ImageIcon图片容器对象
                ImageIcon icon = new ImageIcon(new ImageIcon("static/animation/animation1/" + list[i][j] + ".jpg").getImage().getScaledInstance(200, 200, Image.SCALE_DEFAULT));
                //创建一个JLabel对象(管理容器)并放入图片
                JLabel label = new JLabel(icon);
                //设置图片位置
                label.setBounds(200 * j, (200 * i) + 40, 200, 200);
                //设置斜面浮雕边框
                //bevelType 0表示凹陷,1表示凸起
                label.setBorder(new BevelBorder(0, Color.white, Color.white));
                //添加入隐藏容器中当中
                this.getContentPane().add(label);
            }
        }
        //刷新界面
        this.getContentPane().repaint();

    }

    //加载窗体界面
    private void initJFram(String title, int width, int height) {
        this.setTitle(title);
        this.setSize(width, height);
        //页面始终置顶
        this.setAlwaysOnTop(true);
        //界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //WindowConstants.EXIT_ON_CLOSE 关闭界面时退出程序
        //WindowConstants.DISPOSE_ON_CLOSE 关闭界面不做任何操作
        //WindowConstants.HIDE_ON_CLOSE 关闭界面时隐藏

        //取消默认的居中放置 只有取消了才会根据我们设置的xy轴排列
        this.setLayout(null);
    }

    //设置导航条
    private void setMneuBar() {
        JMenuBar menuBar = new JMenuBar() {
            {
                add(
                        new JMenu("功能") {
                            {
                                add(new JMenuItem(new AbstractAction("重新开始") {
                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        reset();
                                    }
                                }));
                                add(new JMenuItem("重新登录"));
                                add(new JMenuItem(new AbstractAction("关闭界面") {
                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        //关闭界面
                                        System.exit(0);
                                    }
                                }));
                            }
                        }
                );
                add(new JMenu("关于我们"));
            }
        };

        this.setJMenuBar(menuBar);
    }

    //重新开始游戏
    private void reset() {
        step = 0;
        initData();
        initImages();
    }

    //判断是否胜利
    private boolean isWin(int[][] listData) {
        for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (listData[i][j] != finallList[i][j]) return false;
        return true;
    }

    private void initKeyListener() {
        //给界面添加键盘监听
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if (isWin(list)) {
                    //显示确定提示框 点击确认后刷新界面
                    int result = JOptionPane.showConfirmDialog(GameJFram.this, "恭喜你,你赢了!", "提示", JOptionPane.DEFAULT_OPTION);
                    System.out.println(result);
                    reset();
                    return;
                }
                if (keyCode == 38) {
                    if (x < 2) {
                        //交换两值
                        int temp = list[x][y];
                        list[x][y] = list[x + 1][y];
                        list[x + 1][y] = temp;
                        x++;
                        step++;
                        initImages();
                    }
                } else if (keyCode == 40) {
                    if (x > 0) {
                        //交换两值
                        int temp = list[x][y];
                        list[x][y] = list[x - 1][y];
                        list[x - 1][y] = temp;
                        x--;
                        step++;
                        initImages();
                    }
                } else if (keyCode == 39) {
                    if (y > 0) {
                        //交换两值
                        int temp = list[x][y];
                        list[x][y] = list[x][y - 1];
                        list[x][y - 1] = temp;
                        y--;
                        step++;
                        initImages();
                    }
                } else if (keyCode == 37) {
                    if (y < 2) {
                        //交换两值
                        int temp = list[x][y];
                        list[x][y] = list[x][y + 1];
                        list[x][y + 1] = temp;
                        y++;
                        step++;
                        initImages();
                    }
                }
                //添加作弊按钮
                else if (keyCode == 27) {
                    //克隆原始数组
                    for (int i = 0; i < finallList.length; i++)
                        System.arraycopy(finallList[i], 0, list[i], 0, finallList[i].length);

                    x = 2;
                    y = 2;
                    initImages();
                }
                //松开显示完整图片按钮a
                else if (keyCode == 65) initImages();

            }


            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                //按下a不松显示完整图片
                if (keyCode == 65) {
                    //清空页面上所有图片
                    GameJFram.this.getContentPane().removeAll();
                    //加载完整图片
                    //创建一个ImageIcon图片容器对象
                    ImageIcon icon = new ImageIcon(new ImageIcon("static/animation/animation1/all.jpg").getImage().getScaledInstance(600, 600, Image.SCALE_DEFAULT));
                    JLabel all = new JLabel(icon);
                    all.setBounds(0, 40, 600, 600);
                    GameJFram.this.getContentPane().add(all);
                    GameJFram.this.getContentPane().repaint();
                }
            }
        });
    }
}

上次更新: 8/12/2024, 4:28:17 PM