实现MyKeyListener对键盘做出响应

该文讲述了如何在Java中创建一个窗口并添加键盘监听器,使得在按键按下和释放时能触发特定方法。通过定义窗口大小、设置标题以及添加窗口关闭监听,实现了窗口的基本功能。同时,通过重写KeyAdapter类的方法keyPressed和keyReleased,实现在按键按下时移动图形对象。最后,通过在主程序中使用循环和定时刷新,使图形对象能持续响应键盘输入并更新位置,达到简单的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.现在我们只是画了一个正方向但是还不能操作,添加窗口事件的接口

this.addKeyListener(new MyKeyListener());

2.然后我们要写一个类叫键盘监听处理类

//继承Frame类,方便重写里面的方法
public class TankFrame extends Frame {
    public TankFrame(){
        setSize(800,600);//设置窗口大小
        setResizable(false);//设置为false后不能改变大小
        setTitle("tank war");//设置窗口标题为tank war
        setVisible(true);//设置是否显示

        this.addKeyListener(new MyKeyListener());

        addWindowListener(new WindowAdapter() {   //创建一个监听器如果用户点击X后调用windowClosing
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        g.fillRect(200,200,50,50);
    }
    //新建一个键盘监听处理类
    class MyKeyListener extends KeyAdapter {

    }
}

3.然后重写MyKeyListener类中的两个方法

    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {

        }

        @Override
        public void keyReleased(KeyEvent e) {
            
        }
    }

 keyPressed会在一个键被按下去的时候调用

 keyReleased会在一个键被抬起的的时候调用

然后我们修改代码测试一下方法

 class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("key pressed");
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("key released");
        }
    }

再次运行可以看到我们只要按下任意一个键,键盘按下时调用了keyPressed方法在控制台打印出了key pressed,键盘抬起时调用了keyReleased方法在控制台打印出了 key released

4.然后需要实现让我们按下一个键的时候方块能动一下

5.修改代码把方块的位置定义为变量增加一个x和y值

当键盘按下的时候x的值增加200

//继承Frame类,方便重写里面的方法
public class TankFrame extends Frame {
    public int x=200;
    public int y=200;
    public TankFrame(){
        setSize(800,600);//设置窗口大小
        setResizable(false);//设置为false后不能改变大小
        setTitle("tank war");//设置窗口标题为tank war
        setVisible(true);//设置是否显示

        this.addKeyListener(new MyKeyListener());

        addWindowListener(new WindowAdapter() {   //创建一个监听器如果用户点击X后调用windowClosing
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        g.fillRect(x,y,50,50);
    }

    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            x += 200;
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("key released");
        }
    }
}

再次运行可以看到当我们按下键盘上面的一个按键方块的位置没有变化,但是我们把窗口最小化再打开可以发现窗口的位置改变了,这是因为我们没有改变位置后没有重新画出方块,但我再打开窗口的时候矩形会重新绘制

6.再次修改代码,让每次按下按键时方块向右移动200像素

    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            x += 200;
            repaint();
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("key released");
        }
    }

 repaint这个方法每次调用的时候都会重新调用paint方法画出方块

7.要有一办法让它自动的不断的刷新(不能我按一下键盘,我动一下、再按一下键盘、敌人也跟着动一下)

8.有个最简单的办法能解决这个问题,来到Main类里的main方法增加一个循环让它每隔50毫秒刷新一次

public class Main {
    public static void main(String[] args) throws InterruptedException{
        TankFrame tf = new TankFrame();

        while (true){
            Thread.sleep(50);
            tf.repaint();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值