2012-11-29 116 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構造函數。