2012-11-29 90 views
0

我很确定我错过了这里很简单的东西,但我找不到它!KeyListener没有添加

这里是我的GamePanel类的声明:

private class GamePanel extends JPanel implements KeyListener { 

在它的构造是:

addKeyListener(this); 

而且在构造函数中:

 new Thread(new Runnable() { 

      @Override 
      public void run() { 
       while (true) { 
        index ++; 
        index = index >= 15 ? 0 : index; 
        if (aPress) { 
         playerX --; 
        } 
        if (dPress) { 
         playerX ++; 
        } 
        repaint(); 
        try { 
         Thread.sleep(25); 
        } catch (InterruptedException e) {} 
       } 
      } 

     }).start(); 

在类:

@Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("Key pressed!"); 
     if (e.getKeyCode() == KeyEvent.VK_A) { 
      aPress = true; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_D) { 
      dPress = true; 
     } 
    } 
    @Override 
    public void keyReleased(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_A) { 
      aPress = false; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_D) { 
      dPress = false; 
     } 
    } 

最后:

JFrame f = new JFrame(); 
//set up f 
f.add(new GamePanel()); 
f.setVisible(true); 

我甚至在我keyPressed方法添加一个System.out.println,它不会打印!我错过了什么?

+2

我看不到'requestFocusInWindow()'或同步访问共享'keyPressed'。另见[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

@trashgod好的,明天我会试试;我现在要睡觉 – Doorknob

回答

5

KeyListener是一个善变的女主人。 KeyListener注册的组件必须是可以对焦的,并且必须有焦点才能接收关键事件。

尝试在注册侦听器后添加setFocusable(true);requestFocusInWindow();

一个更好的主意是使用key bindings,这将成为焦点问题。

+0

+1对于善变的女主人(哦,是的,也提一下键绑定) – Robin

2

setFocusable(true);添加到GamePanel构造函数。