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