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

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

目录

  • 1.控制小球移动
    • 1.绘制小球
    • 2.键盘监听器
  • 2.控制坦克移动
    • 1.绘制坦克
    • 2.键盘监听器
      • 1.控制键盘上下左右改变坦克方向并移动坦克
    • 2.控制坦克移动
      • 1.坦克父类对象
      • 2.坦克子类对象
      • 3.坦克绘制主函数
      • 4.坦克画板

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) {    }}

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

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) {    }}

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