无法识别来自 KeyListener 的输入

Input from KeyListener isn't recognized

我正在创建一个需要按键输入的低级游戏。因此,像往常一样,我导入了 KeyListenerKeyEvent 库。我创建了三个必需的方法:keyPressedkeyReleasedkeyTyped。然后我在 class "testJPanel" 中添加了一个 keyListener 并且在 keyPressed 方法中,我创建了一个 switch 来检查某个按钮是否被按下或不是。至于keyReleasedkeyTyped方法,我选择留下empty/blank。对我来说,一切似乎都很好,但 Java 似乎不想注册我的键盘输入:当我按下向上箭头键时,程序应该打印 "Test",但遗憾的是,它没有't。为什么?任何帮助将不胜感激。

testJFrame.java

import java.awt.Color;

import javax.swing.JFrame;

public class testJFrame extends JFrame {

    public testJFrame() {
        setTitle("A test application");
        setSize(500, 500);
        setBackground(Color.black);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setFocusable(true);

        add(new testJPanel());
    }

    public static void main(String[] args) {
        testJFrame testJFrame = new testJFrame();
    }

}

testJPanel.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class testJPanel extends JPanel implements KeyListener, ActionListener {

    public testJPanel() {
        Timer timer = new Timer(15, this);
        timer.start();
        addKeyListener(this);
    }

    public void update() {
    }

    @Override
    public void actionPerformed(ActionEvent a) {
        update();
    }

    @Override
    public void keyPressed(KeyEvent k) {
        switch(k.getKeyCode()) {
        case KeyEvent.VK_UP:
            System.out.println("Test");
        }
    }

    @Override
    public void keyReleased(KeyEvent k) {
    }

    @Override
    public void keyTyped(KeyEvent k) {
    }

}

您的面板必须是可聚焦的,并且必须具有焦点才能接收 KeyEvent。添加

setFocusable(true);

到您的面板构造函数并像这样更改您的 testFrame 构造函数

testPanel = new testJPanel();
add(testPanel);
testPanel.requestFocusInWindow();

添加面板后必须调用 requestFocusInWindow()。

您需要使 JPanel 可聚焦:

testPanel.setFocusable(true);
testPanel.requestFocusInWindow();

此外,如果您只想使用 KeyListener 中的 keyPressed 方法 ()。您可以改用 KeyAdapter class:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TestJFrame extends JFrame {

    public TestJFrame() {

        setTitle("A test application");
        setPreferredSize(new Dimension(500, 500));
        setBackground(Color.black);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel testPanel = new JPanel();
        testPanel.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                switch(e.getKeyCode()) {
                    case KeyEvent.VK_UP:
                        System.out.println("Test");
                }
            }
        });
        add(testPanel);
        testPanel.setFocusable(true);
        testPanel.requestFocusInWindow();

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestJFrame();
    }
}