2016-10-09 1 views
0

最近ゲームをしていて、問題が発生しました。私はWASDキーを押したときに、応答がなかったことがありましたが、左矢印キーまたは右矢印キーを押すとうまくいきました。また、KeyPressedとkeyReleasedの両方でSystem.out.println()を使用してデバッグを試みましたが、応答がないときにはkeyPressedには印刷されず、keyReleasedにはメッセージが表示されませんでした。この問題は本当に私を混乱させました。Java keyReleasedはうまく機能しましたが、keyPressedコントロールが失われました

私はゲームにJFrameを使用しており、JFrameにのみキャンバスを追加します。 JFrameとCanvasの両方にkeyListenerを追加しました(私はそれらのうちの1つを削除しようとしましたが、requestFocusは解決していません)。

ここにコードがあります。 keyPressedの場合
:keyReleasedについては

@Override 
public void keyPressed(KeyEvent e) { 
    //When keyPressed lost control, this line did not even work 
    System.out.println("key pressed"); 
    if(e.getKeyCode() == KeyEvent.VK_A){ 
     left = true; 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_D){ 
     right = true; 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_SPACE){ 
     jump(); 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
     attackLeft = true; 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
     attackRight = true; 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_R) init(); 
    else if(e.getKeyCode() == KeyEvent.VK_Q) System.exit(0); 
} 

:keyPressedが働いていなかった

@Override 
public void keyReleased(KeyEvent e) { 
    //This line will output the message every time I released even 
    //if keyPressed did not work. 
    System.out.println("Key released"); 
    if(e.getKeyCode() == KeyEvent.VK_A) left = false; 
    else if(e.getKeyCode() == KeyEvent.VK_D) right = false; 
    else if(e.getKeyCode() == KeyEvent.VK_LEFT) attackLeft = false; 
    else if(e.getKeyCode() == KeyEvent.VK_RIGHT) attackRight = false; 
} 

出力例:

Key pressed 
Key released 
Key pressed 
Key released 
Key released 
Key released 
Key released 
Key released 
Key released 
Key released 
Key released 
Key released 

答えて

0

あなたはJPanelのにキャンバスからの切り替え好むと適切なを行うことができますgetActionMap()の使用put(...)およびgetInputMap()。パネルのput(...)paintComponentメソッドのオーバーライド

あなたも簡単な例は、この

public class Example2 extends JPanel { 

    public Example2() { 
     super(new BorderLayout()); 

     JPanel canvas = new JPanel(); 

     Action action = new AbstractAction() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(e.getActionCommand()); 
      } 
     }; 

     InputMap im = canvas.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

     im.put(KeyStroke.getKeyStroke('w'), "wasd"); 
     im.put(KeyStroke.getKeyStroke('a'), "wasd"); 
     im.put(KeyStroke.getKeyStroke('s'), "wasd"); 
     im.put(KeyStroke.getKeyStroke('d'), "wasd"); 

     canvas.getActionMap().put("wasd", action); 

     add(canvas, BorderLayout.CENTER); 

    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setContentPane(new Example2()); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

} 
のように見えるかもしれ here

を見ている必要があります

関連する問題