我正在開發Java遊戲開發,並且我正在運行的一個問題是實現按鍵敲擊。我已經正確實現了KeyListeners的代碼,但只要我點擊遊戲窗口或其外部,KeyListener就停止工作。關注密鑰監聽器的Java遊戲
我確定這是一個焦點問題,因爲我可以最小化窗口並將其恢復,並且KeyListener將再次運行。
我的設置是一個JFrame,其中包含用於繪製的Canvas對象。我有添加到JFrame的常規KeyListener。
所以,我猜,當我點擊遊戲時,畫布獲得焦點?它不應該,因爲我把isFocasable()設置爲false。
下面是一些我使用的代碼,就這樣沒有任何困惑:
在這裏,我創建了屏幕和帆布
public final void initScreen(DisplayMode dm, boolean fs, boolean vs)
{
screen = new EScreen (dm, fs, vs);
canvas = new EGameCanvas (screen);
canvas.setFocusable (false);
screen.add(canvas);
keyMapManager = KeyMapManager.getInstance (this);
if (fs) {
screen.setFullScreen();
}
else {
screen.setWindowed();
}
}
這是我加的KeyListener (需要注意的是,鍵映射實現KeyListener的,僅此而已)
public boolean setActiveKeyMap(String newKeyMap)
{
if (keyMaps.containsKey(newKeyMap)) {
screen.removeKeyListener (activeKeyMap);
activeKeyMap = keyMaps.get (newKeyMap);
screen.addKeyListener (keyMaps.get (newKeyMap));
return true;
}
return false;
}
這裏是我的,簡單地改變一個變量
keyPressed事件0public void keyPressed(KeyEvent ev) {
if (ev.getKeyCode() == KeyEvent.VK_ESCAPE)
game.setIsRunning (false);
}
請注意,所有這些代碼工作得很好。也就是說,直到我點擊遊戲窗口。我沒有任何地方實現任何MouseListeners。此外,我確實實現了這個代碼:
screen.setFocusTraversalKeysEnabled (false);
最後,正如你所看到的,我的遊戲可以處理全屏模式和窗口模式。這兩個問題都會發生。
正確的解決方案是使用避免這些問題的焦點的鍵綁定對象。請參閱[keybindings教程](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – Robin
我知道KeyBindings是建議的解決方案。但是,出於好奇,是不是有辦法處理KeyListeners的聚焦問題? – Troncoso
@Troncoso *沒有處理KeyListeners焦點問題的方法*只要你看到焦點改變,就是調用'requestFocusInWindow();',即覆蓋'JFrame#windowDeiconfied(..)'並請求焦點在你的'JPanel '。但Keybindings是解決方案。 +1 Robin –