2013-06-05 7 views
1

이론적으로는 눌렀을 때 공개되는 KeyEvent가 트리거되지 않고 문제를 해결하는 웹에서 답변을 찾지 못하는 이유를 알아 내는데 어려움을 겪었습니다.KeyEvents가 트리거되지 않습니다

구현 된 4 개의 키 중 하나를 눌렀다가 놓으면 아무 일도 일어나지 않습니다.

는 (나는 내가 필요로 한 생각에 코드를 줄일 수 있지만, 모든 게시 괜찮다)

//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(); 

을 요청하십시오. 또한 Swing 포커스 관리가 어떻게 작동하는지에 대한 오라클의 문서를 읽으십시오 - 더 많은 함정 (비동기 동작 ...)이 있기 때문에 안전합니다 .--)!

행운을 빈다.

관련 문제