addKeyListener()不适用于JPanel

我正在尝试制作游戏引擎。 我已经制作了Game类,但错误存在于KeyBoard类中。 这里我留下一些代码。

类::游戏

package transfer2pc.co.cc.game.tileengine; import java.awt.Graphics; import java.util.HashMap; import javax.swing.JPanel; import transfer2pc.co.cc.game.tileengine.input.KeyBoard; public abstract class Game extends JPanel implements Runnable { /** * */ private static final long serialVersionUID = 640206679500196209L; HashMap maps = null; KeyBoard keyBoard = null; public Game(){ super(); keyBoard = new KeyBoard(this); setKeyBoard(keyBoard); Thread th = new Thread(this); th.start(); } public void run(){ while(true){ repaint(); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void paint(Graphics g){ } public void addMap(){ } public void setMap(){ } public abstract void keyPressed(int code); public abstract void keyReleased(int code); public abstract void keyTyped(int code); public void setKeyBoard(KeyBoard key){ addKeyListener(key); } } 

Class :: KeyBoard

 package transfer2pc.co.cc.game.tileengine.input; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import transfer2pc.co.cc.game.tileengine.Game; public class KeyBoard extends KeyAdapter implements KeyListener { Game game = null; public KeyBoard(Game gm){ this.game = gm; } @Override public void keyPressed(KeyEvent e) { System.out.println("KeyPressed"); game.keyPressed(e.getKeyCode()); } @Override public void keyReleased(KeyEvent e) { game.keyReleased(e.getKeyCode()); } @Override public void keyTyped(KeyEvent e) { game.keyTyped(e.getKeyCode()); } public static char getChar(int key){ return (char)key; } } 

Class :: KeyTest

 package transfer2pc.co.cc.game.tileengine.test; import java.awt.Graphics; import javax.swing.JFrame; import transfer2pc.co.cc.game.tileengine.Game; import transfer2pc.co.cc.game.tileengine.input.KeyBoard; public class KeyTest extends Game { /** * */ private static final long serialVersionUID = 8557676950779023327L; char pressed; public KeyTest(){ super(); addKeyListener(new KeyBoard(this)); } @Override public void keyPressed(int code) { pressed = KeyBoard.getChar(code); } @Override public void keyReleased(int code) { } @Override public void keyTyped(int code) { } @Override public void paint(Graphics g){ g.drawString("You pressed: "+pressed, 20, 20); } public static void main(String[] args){ JFrame frame = new JFrame("KeyTest"); frame.setSize(640, 480); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.add(new KeyTest()); frame.setVisible(true); } } 

但错误是没有抛出exception并且没有读取输入。 有谁能说我这样做的正确方法..

简而言之,您的面板需要具有针对性。 在创建面板的任何位置添加:

 panel.setFocusable(true); panel.requestFocusInWindow(); 

这是一个SSCCE (我建议将来提出其中一个问题):

 import java.awt.Dimension; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class SimpleKeyTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JFrame frame = new JFrame(); JPanel panel = new JPanel(); frame.getContentPane().add(panel); panel.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) { System.out.println("Pressed " + e.getKeyChar()); } }); panel.setFocusable(true); panel.requestFocusInWindow(); frame.setSize(new Dimension(300, 300)); frame.setVisible(true); } }; SwingUtilities.invokeLater(r); } } 

另外, https://www.google.com/search?q = jpanel + keylistener

您可以将关键监听器添加到JFrame,这是我过去所做的事情。 但是,如果你在JFrame中有其他组件,那可能不是一个好主意。