java - 为什么没有检测到 key ?

标签 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;
    }
}

这是 Racket 和球所在的类(class)/区域:

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,而是使用键绑定(bind),这样效率更高。

最佳答案

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

关于java - 为什么没有检测到 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082290/

相关文章:

Java 8 - 将整数转换为长编译问题

java - Swing 的 Unicode 支持的限制

java - 我的 Keylistener 不起作用,我想知道原因

listview - 将监听器添加到 BlackBerry 中的 listField

java - 无法在自定义 View 中显示两个项目

java - 有什么方法可以将字符串数组转换为字符数组吗?

java - JTable 中未显示 ColumnName

java - 如何在 JFrame 之间切换时保持 KeyListener 处于 Activity 状态

java - 如何使用 ArrayList 在 JOptionPane 中显示多行

java - 如何将 JTextField[][] 作为参数传递给动态加载的 java 类方法?