KeyListener 不响应按键输入

KeyListener not responding to key inputs

所以我看到了几个这样的问题。他们都说您不应该使用 Keylistener,而应该使用 KeyBinding。但是当我去使用键绑定时它不起作用。我知道我可能应该使用 KeyBinding 东西但是有没有办法可以修复我的代码以便 KeyListener 工作。谢谢。

游戏Class:

public class Game extends JFrame implements KeyListener{
    public static int ppx,ppy;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,600);
        frame.add(new THIng());
        frame.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == KeyEvent.VK_D){
            System.out.println("Debug");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

}

事物Class:

    public class THIng extends JPanel{
    public static int px,py,pwid,phei;

    public void main(String[]args){
        Timer timer;
        timer = new Timer(60,
                new ActionListener(){
                    public void actionPerformed(ActionEvent evt){
                        p();
                    }
                }
        );
    }
    public THIng(){

        px = Game.ppx;py = Game.ppy;pwid = 50;phei = pwid;
    }

    @Override
    public Dimension getPreferredSize(){
        return new Dimension(500,600);
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics p = (Graphics)g;
        p.drawRect(px,py,pwid,phei);

    }
    public void p(){
        repaint();
    }

}

正如 MadProgrammer 指出的那样,正确的做法是使用键绑定 API,您可以逐步查看 Key Bindings API

添加一个添加关键侦听器的构造函数,并在您的主程序中使其成为 class 游戏而不是 JFrame

public class Game extends JFrame implements KeyListener{
    public static int ppx,ppy;

    public Game(String string) {
        addKeyListener(this);
        // TODO Auto-generated constructor stub
    }

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

        frame.setVisible(true);

    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == KeyEvent.VK_D){
            System.out.println("Debug");
        }
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }



}

您不必创建构造函数,只需在您已设置 JFrame 的其他属性的位置添加 frame.addKeyListener(this);