2016-12-09 9 views
-1

最近タンクゲームを作ったが、重大な問題が発生している。キーボード入力ではKeyListenerを使用しましたが、再生中に突然KeyListenerが応答しませんでした。キーが機能しなくなりました。私はインターネット上の問題を探していました。私はKeyBindingを使うべきであるとの多くの答えを見つけました。私はそうしましたが、問題は再び現れました。私は何をすべきか?KeyListenerとKeyBindingの問題

これは、KeyBindingのコードのほんの一部です。

public Action redTankBackwardReleased = new AbstractAction("action") { 
    private static final long serialVersionUID = 1L; 
    public void actionPerformed(ActionEvent e) { 
     Game.redTank.xSpeed = 0; 
     Game.redTank.ySpeed = 0; 
    } 
}; 

panel.getInputMap().put(KeyStroke.getKeyStroke("released DOWN"), "8"); 
panel.getActionMap().put("8", redTankBackwardReleased); 

すべてが完璧ですが、数秒後または多分1分後にキーが反応しなくなるだけです。わかりません。

+1

のようなものでなければなりませんに。これをここやサイトで解決するための助けが必要な場合は、適切なコードを投稿したいと思うでしょう。プログラムや小さなスニペット全体を投稿するのではなく、あなたの問題を示す非常に小さなコンパイル可能な実行可能プログラム[mcve]を投稿することをお勧めします。 –

+0

コードなしではあまりできません。私が与えることができる最高の勧告は、コンポーネントがフォーカスを持っている場合にのみ 'KeyEvent'を受け取るので、' FocusListener'を使ってフォーカスが失われた時を把握してください。それ以外にも、コードなしでできることはあまりありません。 – Paul

+0

@Paul:彼がキーバインディングを使用している場合、フォーカスは問題にならないはずです*** ***彼は正しいInputMapを使用しますが、彼は彼のコードなしでどのInputMapを使用しているかわかりません。 –

答えて

2

間違ったInputMapを使用しています。 int定数JComponent.WHEN_IN_FOCUSED_WINDOWに関連付けられているものを使用してください。これは、その後のSwing GUI、キーバインディングである場合には*動作するはずですし、そうでない場合は、あなたのコードのバグを持っている必要があり、我々は関与していないなら1 *

KeyStroke releasedDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true); 
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; 
InputMap inputMap = panel.getInputMap(condition); 
ActionMap actionMap = panel.getActionMap(); // there's only one ActionMap 

// then use as you normally would 
inputMap.put(....); 
actionMap.put(...); 
+0

これで問題が解決しない場合は、あなたの質問への私のコメントに記されているように、有効な[mcve]を投稿してください。リンクをご覧ください。 –

+0

そしてこのコードでは、キーを押したときに実行されるコードを実装する必要がありますか? – Erninger

+0

@Erninger:もちろんActionMapに入るActionで。 Key Bindingsチュートリアルはまだ完了しましたか?そうでない場合は、[Key Bindings](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を参照してください。 –