2013-05-03 88 views
1

基本上我已經創建了連接到我的JPanel一鍵收聽..有時,當我編譯和運行它的工作真的很好,沒有問題,什麼那麼.. 但後來有時當我編譯它不會工作。它不識別按鍵。主要聽衆和鍵綁定不工作的每個編譯

這是我在JPanels更新方法用於密鑰監聽器代碼:

if(keyListener.getMovingRight() == KeyEvent.VK_RIGHT){ 
           player.playerMoveRight(); 
       } 
       if(keyListener.getMovingLeft() == KeyEvent.VK_LEFT){ 
           player.playerMoveLeft(); 
       } 
       if(keyListener.getMovingUp() == KeyEvent.VK_UP){ 
           player.playerMoveUp(); 
       } 
       if(keyListener.getMovingDown() == KeyEvent.VK_DOWN){ 
        player.playerMoveDown(); 
       } 

和上面的代碼知道,如果從這個類是按鍵:

public class KeyBoard implements KeyListener { 

   private int playerMoveUp; 
   private int playerMoveDown; 
   private int playerMoveLeft; 
   private int playerMoveRight; 

   public KeyBoard(){ 
       playerMoveUp = 0; 
       playerMoveDown = 0; 
       playerMoveLeft = 0; 
       playerMoveRight = 0; 
   } 

   @Override 
   public void keyTyped(KeyEvent keyEvent) { 
   } 

   @Override 
   public void keyPressed(KeyEvent keyEvent) { 

       //Switch statement to get which keys were pressed 
       switch(keyEvent.getKeyCode()){ 

           case KeyEvent.VK_UP: 
               playerMoveUp = keyEvent.getKeyCode(); 
               break; 

           case KeyEvent.VK_DOWN: 
               playerMoveDown = keyEvent.getKeyCode(); 
               break; 

           case KeyEvent.VK_LEFT: 
               playerMoveLeft = keyEvent.getKeyCode(); 
               break; 

           case KeyEvent.VK_RIGHT: 
               playerMoveRight = keyEvent.getKeyCode(); 
               break; 
       } 
   } 

   @Override 
   public void keyReleased(KeyEvent keyEvent) { 

       //Switch statement to get which keys were released 
       switch(keyEvent.getKeyCode()){ 

           case KeyEvent.VK_UP: 
               playerMoveUp = 0; 
               break; 

           case KeyEvent.VK_DOWN: 
               playerMoveDown = 0; 
               break; 

           case KeyEvent.VK_LEFT: 
               playerMoveLeft = 0; 
               break; 

           case KeyEvent.VK_RIGHT: 
               playerMoveRight = 0; 
               break; 
       } 
   } 

   public int getMovingUp(){ 
       return playerMoveUp; 
   } 
   public int getMovingDown(){ 
       return playerMoveDown; 
   } 
   public int getMovingLeft(){ 
       return playerMoveLeft; 
   } 
   public int getMovingRight(){ 
       return playerMoveRight; 
   } 
} 

而且我ofcourse通過這樣做將關鍵聽衆添加到JPanel:

panel.addKeyListener(KeyBoardClasshere); 

由於它不是定期的工作我嘗試別的東西叫做關鍵Bindigs因爲我聽說會增加我的機會..

我說這在我的JPanel類和註釋掉的更新方法的關鍵聽衆:

public void keyBindingsInitialize(ActionMap am, InputMap im){ 
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right"); 
     am.put("Right", RightBind); 

     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left"); 
     am.put("Left", LeftBind); 

     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up"); 
     am.put("Up", UpBind); 

     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down"); 
     am.put("Down", DownBind); 
   } 
    
   Action RightBind = new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      player.playerMoveRight(); 
     } 
   }; 
   Action LeftBind = new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      player.playerMoveLeft(); 
     } 
   }; 
   Action UpBind = new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      player.playerMoveUp(); 
     } 
   }; 
   Action DownBind = new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      player.playerMoveDown(); 
     } 
   }; 

這也適用,但有時當我編譯和運行項目它只是不工作,然後,如果我終止該項目,然後再運行它..它的工作在我oppinion洙奇怪..任何人有什麼建議?

編輯: 我跟着這個問題的answear:KeyListener on JPanel randomly unresponsive

我從點擊該apears按鈕和空格鍵,但不是在更新方法使用的密鑰得到迴應。而現在經過我有時當我運行應用程序時添加了按鈕,所有我得到的都是一個灰色的窗口,必須重新啓動它幾次才能使其恢復正常,就像在我鏈接的問題中一樣。

+0

您是否嘗試將KeyListener添加到您的框架而不是面板?不知道這是否會奏效,但值得一試 – nullptr 2013-05-03 20:41:03

+1

您會看到一個奇怪的錯誤,不會在每次運行程序時發生,但只會間歇性地發生。這表明你可能有一個Swing線程問題,在某處,你的代碼可能不適合適應Swing線程規則。您是否正在小心翼翼地在EDT上啓動您的GUI,即Swing Event Dispatch Thread?你能創建併發佈一個能夠證明你的問題的[sscce](http://sscce.org)嗎? – 2013-05-03 20:41:10

+0

@nullptr:我對你的建議有強烈的懷疑。 – 2013-05-03 20:42:13

回答

1

嘗試增加

setFocusable(true); 

你JPanel的構造。

+0

我已經在我的構造函數中有。而且我確實有「requestFocusInWindow();」 – Rakso 2013-05-03 20:46:01

0

通過在我的遊戲循環中添加frame.revalidate();解決了它。 謝謝你的回覆!

+0

這不適合我。抱歉。 – 2013-05-03 21:31:03

+0

@HovercraftFullOfEels好了加入後,它確實開始正常工作 – Rakso 2013-05-03 21:51:59

+3

我不懷疑,但它聞起來像一個更大的更有害的問題,主要是一個kludge隱藏線程問題的kludge。如果我是對的,那麼我們一定會再次看到你的另一個間歇性地發生在GUI上的問題。我希望我錯了。 – 2013-05-03 21:55:47