Java 为什么不';检测到t键?

Java 为什么不';检测到t键?,java,swing,keylistener,keyevent,Java,Swing,Keylistener,Keyevent,我有一个乒乓球游戏,正在尝试找出如何检测几把钥匙。这是我的划桨课: 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; } } 以下是PongBa

我有一个乒乓球游戏,正在尝试找出如何检测几把钥匙。这是我的划桨课:

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,这样效率更高。

您需要调用来注册您的
KeyListener
实现。在要侦听其关键事件的组件上调用它。可能
this.addKeyListener(this)。我会将您的KeyListener实现作为一个单独的类。

我认为更好的解决方案是使用
KeyboardFocusManager
。您可能会遇到与KeyListener相关的问题(如上所述),因为它需要重点关注,您必须注册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;
    }

}

如果您愿意,请检查它是否有效,并告诉我它是否解决了您的问题。

正如camickr所说,键绑定是一种方法。不要使用键侦听器。

您是否尝试过在事件方法和调试中放置断点以查看它们是否被触发?您不应该使用键侦听器。这个问题每天都有人问。您应该使用键绑定。您可以通过查看本页右侧
相关
标题下的主题来查找更多信息,也可以在论坛中搜索密钥绑定。@WyattLowery,请退出。同样,请遵循@camickr的建议。另外,不要忘记在方法重写中调用
super.paintComponent(g)
。@WyattLowery然后我建议取消选择您接受的答案,也许提供您自己的答案并接受它,否则会误导他人。我将其添加到构造函数中,仍然没有发生任何事情。请尝试调用requestFocus()在添加侦听器的正下方。使用键绑定。Swing设计用于键绑定,以处理特定的
击键操作
@WyattLowery的
操作:遵循camickr的建议,而不是dsh。虽然dsh的意思是好的,但这里很少有人拥有Rob Camick的挥杆技术。请注意,键绑定是Swing组件本身检测按键笔划的方式,它比KeyListener具有更大的灵活性和功能。它还允许您避免焦点问题。@WyattLowery不确定这是如何回答问题的:1)您不能单击JComponent使其获得焦点。2) 除非组件显示在可见的框架上,否则不能对组件使用requestFocus(),因此无法在构造函数中调用该方法。3) 要使用的正确方法是requestFocusInWindow()。4) 默认情况下,JComponent不可聚焦,因此无法接收焦点。不要使用幻数。没有人知道“82”是什么意思。这不是一个可取的解决办法。将对框架上的“所有组件”执行逻辑。是的,在这种情况下,这可能无关紧要,但这不是使用的方法。再次阅读
键绑定