在Java中添加KeyListener?

时间:2017-05-17 11:57:32

标签: java keylistener

在我的简单程序中,球的起点是x=0, y=0。还在每个Timer动作中设置定时器,x增加a,y增加b。 a和b的初始值都是1.这是有效的:当运行程序Moving1.java时,球从框架的左上方向左下方移动。

但是,我也尝试添加KeyEvent,以便我可以在KeyEvents中更改a和b的值,但它们不起作用。出于某种原因,似乎程序不会进入任何KeyEvent。怎么修好?主KeyEvent是keyPressed但我已经为每个KeyEvent编写了b = 0,它应该对球的方向生效。

如果有人可以帮我解决这个问题,我想我可以在keyPressed Event添加正确的软件:

public void keyPressed (KeyEvent e) {
    int KeyCode = e.getKeyCode();
    if (KeyCode == KeyEvent.VK_LEFT) {
        a = -1;
        b = 0;
    }
}

等等。

但这是我的代码:

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

public class Moving1 extends JPanel implements KeyListener {
    int x, y;
    int a = 1, b = 1;
    Timer timer;


    public Moving1() {
        x = 0;
        y = 0;
        timer = new Timer(30, new TimerListener());
    }

    private class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            x += a; // add horizontal
            y += b; // add vertical
            repaint();
        }
    }

    public void keyPressed(KeyEvent e) {
        b = 0;
    }

    public void keyReleased(KeyEvent e) {
        b = 0;
    }

    public void keyTyped(KeyEvent e) {
        b = 0;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(x, y, 10, 10);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("Moving1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Moving1 m = new Moving1();
        f.add(m);
        f.setSize(500, 500);
        f.setVisible(true);
        m.timer.start();
    }
}

1 个答案:

答案 0 :(得分:1)

您未将KeyListener添加到任何内容中,因此无法处理任何事件。将以下行放在您的主要内容中,这应该会有事件发生。

f.addKeyListener(m);