Java怎么通过键盘实现动态控制小球移动

这一操作依赖于Java的事件机制,键盘按键会触发一个事件, 我们捕获到这个事件,然后做相应的处理。

所谓动态移动其实就是根据坐标不断地重新绘制。

思路

  1. 定义一个MyPanel类 继承 JPanel
  2. 然后在MyPanel的paint方法里画出一个小球,将它的坐标设置为全局变量
  3. 让我们的面板类实现键盘监听器KeyListener,然后在keyPressed方法里更新小球的坐标,然后repaint()
  4. 把我们的MyPanel对象放到一个JFrame里显示,让JFrame对象也注册键盘监听事件 ,传入我们实现了KeyListener的 MyPanel对象,作为键盘事件的处理方法,addKeyListener(myPanel)
package event;

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

/**
 * 演示小球通过键盘控制上下左右的移动,依靠java事件机制实现
 */
public class Ballmove extends JFrame {
    public static void main(String[] args) {
        new Ballmove();
    }
    public Ballmove() {
        MyPanel myPanel = new MyPanel();
        this.add(myPanel);
        //让窗口 JFrame 对象可以监听到键盘事件
        this.addKeyListener(myPanel);
        this.setSize(400,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

//KeyListener是一个监听器,可以监听键盘事件,类比可以推知,还有鼠标监听器等
class MyPanel extends JPanel implements KeyListener {
    //x和y是小球的左上角坐标,为了让他动起来,设置为变量
    int x = 10;
    int y = 10;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //画出小圆球,每次按键其实都是根据新的x、y重新画了一次小球
        g.fillOval(x, y , 20, 20);

    }

    //有字符输出时,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {
    }

    //当某个键按下,该方法会触发,一般我们在这里写触发的逻辑即可
    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println((char)e.getKeyCode() + " 被按下了..");
        //根据用户按下的不同键,来处理小球的移动
        //每一个键都有对应的code,e.getKeyCode()就是获取当前事件的按键code
        if(e.getKeyCode() == KeyEvent.VK_DOWN){  //VK_DOWN就是下箭头的code
            y++; //
            this.repaint(); //当使用repaint()时,paint方法将被调用,即完成重绘
        }else if(e.getKeyCode() == KeyEvent.VK_UP){  //VK_DOWN就是下箭头的code
            y--;
            this.repaint();
        }else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
            x++;
            this.repaint();
        }else if(e.getKeyCode() == KeyEvent.VK_LEFT){
            x--;
            this.repaint();
        }
    }

    //当某个键释放,该方法会触发
    @Override
    public void keyReleased(KeyEvent e) {
    }
}

ballMove

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值