2017-04-10 162 views
0

我的KeyListener没有注册任何键被按下,我能做些什么来解决这个问题?我曾尝试使用键码而不是VK_DOWN格式,但这没有什么不同。我没有使用一个JPanel ..为什么我的KeyListener不起作用?

 import javax.swing.*; 
    import java.awt.event.*; 
    public class SnakeFrame extends JFrame 
    { 
final int FRAME_WIDTH = 800; 
final int FRAME_HEIGHT = 700; 
private SnakeComponent scene; 
class KeyPressListener implements KeyListener 
{ 
    public void keyPressed(KeyEvent e) 
    { 
     int keyCode = e.getKeyCode(); 
     switch(keyCode) { 
      case KeyEvent.VK_UP: 
      // handle up 
      System.out.println("Hello"); 
      case KeyEvent.VK_DOWN: 
      // handle down 
      scene.a("d"); 
      case KeyEvent.VK_LEFT: 
      // handle left 
      scene.a("l"); 
      case KeyEvent.VK_RIGHT : 
      // handle right 
      scene.a("r"); 
     } 
     KeyListener key = new KeyPressListener(); 
     scene.addKeyListener(key); 
    } 

    public void keyReleased(KeyEvent e){} 

    public void keyTyped(KeyEvent e) {} 
} 
class TimerListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent event) 
    { 
     scene.moveSnake(); 
     scene.eaten(); 
     scene.gameOver(); 
    } 
} 
public SnakeFrame() 
{ 
    scene = new SnakeComponent(); 
    add(scene); 

    setSize(FRAME_WIDTH, FRAME_HEIGHT); 

    KeyListener key = new KeyPressListener(); 
    scene.addKeyListener(key); 

    ActionListener listener = new TimerListener(); 
    final int DELAY = 80; 
    Timer t = new Timer(DELAY, listener); 
    t.start(); 

} 

}

我试图if/else语句代替开关外壳和不工作

回答

0

KeyListener需要两样东西的工作,它需要它注册的组件是focsuable并且在它将生成密钥之前具有当前的键盘焦点,这是KeyListener的已知限制

如同关于该主题的每个其他问题一样,推荐最终解决方案是使用Key Bindings API,该设计除其他外,设计用于解决此问题,并为您提供控制以确定应在哪个焦点级别生成事件