为什么没有检测到钥匙?

时间:2015-08-18 20:47:32

标签: java swing keylistener keyevent

我有一个Pong游戏,我正在试图找出如何检测几个键。这是我的桨类:

import java.awt.geom.*;

public class Paddle extends Rectangle2D.Float{
    public Paddle(int x, int y){
        super.x = x;
        super.y = y;
        super.width = w;
        super.height = h;
    }
}

以下是PongBall类:

import java.awt.geom.*;

public class PongBall extends Ellipse2D.Float{
    public PongBall(int x, int y, int w, int h){
        super.x = x;
        super.y = y;
        super.width = w;
        super.height = h;
    }
}

以下是球拍和球的等级/区域:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.JComponent;

public class PongPlayArea extends JComponent implements KeyListener{

public int width, height;

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(600, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    PongPlayArea ppa = new PongPlayArea(600, 600);
    Timer t = new Timer(20, e -> {ppa.repaint();});
    t.start();

    frame.add(ppa);
    frame.setVisible(true);
}
public PongPlayArea(int width, int height){
    this.width = width;
    this.height = height;
    this.addKeyListener(this);
}
public void paintComponent(Graphics g){

    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.BLACK);
    g2.draw(new Rectangle2D.Float(0, 0, width, height));
    g2.fill(getVisibleRect());

    g2.setColor(Color.WHITE);
    g2.draw(new Paddle());
}
public Dimension getPreferredSize(){
    return new Dimension(width, height);
}
public void keyPressed(KeyEvent e){
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
        System.out.println("Success");
    }
}
public void keyReleased(KeyEvent e){

}
public void keyTyped(KeyEvent e){

}
}

我的问题是,当按下按键时(在这种情况下,右箭头键)没有任何事情发生。我不知道出了什么问题。有没有人有解决方案?

编辑: 回答: 正如camickr所建议的,我决定使用键绑定,而不是使用KeyListener,效率更高。

3 个答案:

答案 0 :(得分:3)

您需要致电.addKeyListener()注册KeyListener实施。在要监听关键事件的组件上调用它。可能是this.addKeyListener(this);。我会让你的KeyListener实现成为一个单独的类。

答案 1 :(得分:0)

我认为更好的解决方案是使用KeyboardFocusManager。你可能遇到KeyListeners的问题(如上所述),因为它需要集中注意力,你必须注册Listener并向你的PongPlayArea类添加方法(这会变得很长)等等。我有类似你的问题,我找到的最佳解决方案是KeyboardFocusManager。 致你的构造函数:

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());

创建课程:

private class GameDispatcher implements KeyEventDispatcher {

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == 82) {
            System.out.println("Success");
        }
        return false;
    }

}

如果你想要检查它是否有效,并告诉我它是否解决了你的问题。

答案 2 :(得分:0)

正如camickr所说,键绑定是要走的路。不要使用关键的听众。