【Java】事件处理机制(KeyListener监听键盘事件)键盘控制图像移动

发布于:2022-07-26 ⋅ 阅读:(359) ⋅ 点赞:(0)

1.控制小球移动

1.先定义一个Mypanel,继承JPanel,画图行就在面板上画。
Mypanel可以理解为一个画板
Graphics可以理解为一个画笔,提供了很多绘图的方法
.第二步
//定义一个面板
private MyPanel mp=null;

**3.第三步

public drawCircle(){
//初始化面板
mp=new MyPanel();
//把面板放人窗口
this.add(mp);
//设置窗口大小
this.setSize(400,300);
this.setVisible(true);
}**

1.绘制小球

//演示通过键盘控制小球上下左右的移动,Java的事件控制
public class BallMove extends JFrame{
    private MyPanel mp=null;

    public static void main(String[] args) {
        new BallMove();
    }
    public BallMove(){
        mp=new MyPanel();
        this.add(mp);
        this.setSize(500,400);
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}
//面板,画出小球
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    int x=10;
    int y=10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,30,30);
    }
 

//当点击窗口小叉,程序完全退出。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

2.键盘监听器

//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    int x=10;
    int y=10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,30,30);
    }
    //有字符输出,该方法触发
    @Override
    public void keyTyped(KeyEvent e) {

    }
    //当某个键按下,该方法触发
    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println((char)e.getKeyChar()+"被按下");

        //根据用户按下的不同键,来处理小球上下左右的移动。
        if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
            y+=6;
        }else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
            y-=6;
        }else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
            x+=7;
        }else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
            x-=7;
        }

        //让面板重绘
        this.repaint();
    }
    //当某个键释放,该方法触发
    @Override
    public void keyReleased(KeyEvent e) {

    }

通过键盘控制小球上下左右的移动,Java的事件控制

package com.event_;

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

/**
 * @version 1.0
 * @auther Demo龙
 */
//演示通过键盘控制小球上下左右的移动,Java的事件控制
public class BallMove extends JFrame{
    private MyPanel mp=null;

    public static void main(String[] args) {
        new BallMove();
    }
    public BallMove(){
        mp=new MyPanel();
        this.add(mp);
        this.setSize(500,400);
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}

//面板,画出小球
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    int x=10;
    int y=10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,30,30);
    }
    //有字符输出,该方法触发
    @Override
    public void keyTyped(KeyEvent e) {

    }
    //当某个键按下,该方法触发
    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println((char)e.getKeyChar()+"被按下");

        //根据用户按下的不同键,来处理小球上下左右的移动。
        if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
            y+=6;
        }else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
            y-=6;
        }else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向上移动对应的的code{
            x+=7;
        }else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向上移动对应的的code{
            x-=7;
        }

        //让面板重绘
        this.repaint();
    }
    //当某个键释放,该方法触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}

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

2.控制坦克移动

1.绘制坦克

package com.tankgame01;

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

/**
 * @version 1.0
 * @auther Demo龙
 */
//坦克大战的绘图区域
public class MyPanel extends JPanel {
    //定义我的坦克
    Hero hero=null;

    public MyPanel() {
        hero =new Hero(100,100);//初始化自己的坦克
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形默认黑色

        //画出坦克封装方法。
        drawtank(hero.getX(),hero.getY(),g,0,0);
    }
    /**
     * @param x      坦克的左上角x坐标
     * @param y      坦克的左上角y坐标
     * @param g      画笔
     * @param direct 坦克方向(上下左右)
     * @param type   坦克类型
     */
    //编写方法,封装坦克
    public void drawtank(int x,int y,Graphics g,int direct,int type){
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.magenta);
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);
                break;
        }
        switch (direct) {
            case 0://我们的坦克
                g.fill3DRect(x, y, 10, 60, false);
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }

    }
}

2.键盘监听器

1.控制键盘上下左右改变坦克方向并移动坦克

//根据坦克方向,绘制对应形状的坦克
        //分别用0上1右2下3左
        switch (direct) {
            case 0://我们的坦克向上
                g.fill3DRect(x, y, 10, 60, false);
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y);//画出炮筒
                break;
            case 1://我们的坦克向右
                g.fill3DRect(x, y, 60, 10, false);
                g.fill3DRect(x, y+30, 60, 10, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//画出坦克盖子
                g.fillOval(x + 20, y + 10, 20, 20);//画出圆形盖子
                g.drawLine(x + 30, y + 20, x + 60, y+20);//画出炮筒
                break;
            case 2://我们的坦克向下
                g.fill3DRect(x, y, 10, 60, false);
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y+60);//画出炮筒
                break;
            case 3://我们的坦克向左
                g.fill3DRect(x, y, 60, 10, false);
                g.fill3DRect(x,y+30, 60, 10, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//画出坦克盖子
                g.fillOval(x + 20, y + 10, 20, 20);//画出圆形盖子
                g.drawLine(x + 30, y + 20, x , y+20);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
        //根据用户按下的不同键,来处理坦克上下左右的移动。
        if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
            //改变坦克的方向
            hero.setDirect(2);
            hero.down();
            //修改坦克的坐标
        }else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
            hero.setDirect(0);
            hero.up();
        }else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
            hero.setDirect(1);
            hero.right();
        }else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
            hero.setDirect(3);
            hero.left();
        }
        this.repaint();
    }

2.控制坦克移动

1.坦克父类对象

package com.tankgame02;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Tank {
    private int x;//坦克横坐标
    private int y;//坦克纵坐标
    private int direct;//坦克方向
    private int speed;//坦克速度

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    //向上下左右移动
    public void up(){
        y-=speed;
    }
    public void down(){
        y+=speed;
    }
    public void right(){
        x+=speed;
    }
    public void left(){
        x-=speed;
    }
    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

2.坦克子类对象

package com.tankgame02;

/**
 * @version 1.0
 * @auther Demo龙
 */
//主角坦克
public class Hero extends Tank {
    public Hero(int x, int y) {//构造器
        super(x, y);
    }

}

3.坦克绘制主函数

package com.tankgame02;

import javax.swing.*;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class tankgame02 extends JFrame {
    //定义MyPanel
    MyPanel mp=null;
    public static void main(String[] args) {
        new tankgame02();
    }
    public tankgame02() {
        mp=new MyPanel();
        this.add(mp);
        this.setSize(1000,750);
        this.addKeyListener(mp);
        //当点击窗口小叉,程序完全退出。
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}

4.坦克画板

package com.tankgame02;

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

/**
 * @version 1.0
 * @auther Demo龙
 */
//坦克大战的绘图区域
    //为了监听键盘事件,实现
public class MyPanel extends JPanel implements KeyListener {
    //定义我的坦克
    Hero hero=null;

    public MyPanel() {
        hero =new Hero(100,100);//初始化自己的坦克
        hero.setSpeed(6);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形默认黑色

        //画出坦克封装方法。
        drawtank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
    }
    /**
     * @param x      坦克的左上角x坐标
     * @param y      坦克的左上角y坐标
     * @param g      画笔
     * @param direct 坦克方向(上下左右)
     * @param type   坦克类型
     */
    //编写方法,封装坦克
    public void drawtank(int x,int y,Graphics g,int direct,int type){
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.magenta);
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);
                break;
        }

        //根据坦克方向,绘制对应形状的坦克
        //分别用0上1右2下3左
        switch (direct) {
            case 0://我们的坦克向上
                g.fill3DRect(x, y, 10, 60, false);
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y);//画出炮筒
                break;
            case 1://我们的坦克向右
                g.fill3DRect(x, y, 60, 10, false);
                g.fill3DRect(x, y+30, 60, 10, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//画出坦克盖子
                g.fillOval(x + 20, y + 10, 20, 20);//画出圆形盖子
                g.drawLine(x + 30, y + 20, x + 60, y+20);//画出炮筒
                break;
            case 2://我们的坦克向下
                g.fill3DRect(x, y, 10, 60, false);
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y+60);//画出炮筒
                break;
            case 3://我们的坦克向左
                g.fill3DRect(x, y, 60, 10, false);
                g.fill3DRect(x,y+30, 60, 10, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//画出坦克盖子
                g.fillOval(x + 20, y + 10, 20, 20);//画出圆形盖子
                g.drawLine(x + 30, y + 20, x , y+20);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        //根据用户按下的不同键,来处理坦克上下左右的移动。
        if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
            //改变坦克的方向
            hero.setDirect(2);
            hero.down();
            //修改坦克的坐标
        }else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
            hero.setDirect(0);
            hero.up();
        }else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
            hero.setDirect(1);
            hero.right();
        }else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
            hero.setDirect(3);
            hero.left();
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

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


网站公告

今日签到

点亮在社区的每一天
去签到