2013-06-05 77 views
1

我很難弄清楚爲什麼KeyEvent在理論上被按下/釋放時不會觸發,並且已經在Web上找到了滿足該問題的答案。KeyEvents不會觸發

當四個實現的鍵中的任何一個被按下/釋放時都不會發生任何事情。

(我砍倒的代碼是什麼,我認爲是需要的,但不介意張貼全部)

//Outter Class imports 
import javax.swing.*; 

import java.util.*; 
import java.util.ArrayList; 

import java.awt.*; 
import java.awt.Image; 
import java.awt.image.*; 
import javax.imageio.*; 


//Inner Class(1) imports 
import java.awt.event.*;  
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class Game extends JPanel { 

     //fields... 


    public Game(){ 
     GWin = new JFrame("Space Invaders"); 
     JPanel panel = new JPanel(); 
     panel.setSize(new Dimension(Length, Height)); 
     panel.setLayout(null); 
     addKeyListener(new KeyInputHandler()); 
     GWin.add(panel); 

     WindowListener exitListener = new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(null, "Are You Sure to Close Application?", "Exit Confirmation", 
       JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); 

       if (confirm == 0) { 
        GWin.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  
       } 
      } 
     }; 

     GWin.addWindowListener(exitListener); 

     GWin.setExtendedState(Frame.MAXIMIZED_BOTH); 
     GWin.setUndecorated(true); 

     GWin.setVisible(true); 
     requestFocus(); 

     startGame(); 
    } 

    public static void main(String arg[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        new WIN(Length ,Height); 
       } 
      }); 
     } 

    private class KeyInputHandler extends KeyAdapter { 
    /** 
    * A class to handle keyboard input from the user. The class 
    * handles both dynamic input during game play, i.e. left/right 
    * and shoot, and more static type input (i.e. press any key to 
    * continue) 
    */ 
     @Override 
     public void keyPressed(KeyEvent e) { 
      if (waitingForKeyPress) { 
       return; 
      } 

      int key = e.getKeyCode(); 
      if (key == KeyEvent.VK_A){ 
       leftPressed = true; 
      } 
      if (key == KeyEvent.VK_F) { 
        rightPressed = true; 
      } 
      if (key == KeyEvent.VK_SPACE) { 
        firePressed = true;                                                                      
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      if (waitingForKeyPress) { 
       return; 
      } 

      int key = e.getKeyCode(); 

      if (key == KeyEvent.VK_A) { 
        leftPressed = false; 
      } 
      if (key == KeyEvent.VK_F) { 
        rightPressed = false; 
      } 
      if (key == KeyEvent.VK_SPACE) { 
        firePressed = false;                                                                       
      } 
     } 

     @Override 
     public void keyTyped(KeyEvent e){ 
      int key = e.getKeyCode(); 
      if (waitingForKeyPress) { 
       if (pressCount == 1) { 
        waitingForKeyPress = false; 
        pressCount = 0; 
       } else { 
        pressCount++; 
       } 
      } 

      if (e.getKeyChar() == 27) { 
       GWin.dispose(); 
      } 
     } 
    } 
} 

回答

0

我的第一個猜想是你的JPanel後代Game尚未獲得焦點。嘗試:

this.setFocusable(true); 
this.requestFocus(); 

請求焦點之前。另外,請務必閱讀Oracle關於Swing焦點管理如何工作的文檔 - 它會爲您提供很多時間,因爲存在更多的陷阱(異步行爲...):-)!

祝你好運!