如果每次问这个问题我都有一美元,我就会退休。 根据以前的类似问题...
是的,您需要使JPanel具有可聚焦性,以使其KeyListener起作用
而且,您还必须给它一个焦点,因为集中注意力是不够的。 通常,这是通过在侦听的JPanel上调用requestFocusInWindow()来实现的。
如果KeyListener要继续运行,则其他任何事物都无法获得焦点或失去焦点。
这是我们大多数人建议不要在Swing应用程序中使用KeyListener的几个原因之一
编辑
我已经使用了您的代码,并且可以使用,无论是键绑定还是KeyListener:
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class Game extends JPanel {
private InputHandler inputHandler;
public Game() {
setFocusable(true);
requestFocus();
requestFocusInWindow();
getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
getActionMap().put("pressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Space is pressed");
}
});
this.inputHandler = new InputHandler();
addKeyListener(this.inputHandler);
setPreferredSize(new Dimension(500, 500));
}
class InputHandler extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("key pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("key released");
}
}
private static void createAndShowGui() {
Game mainPanel = new Game();
JFrame frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}