2012-11-17 88 views
0

我正在開發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事件0
public void keyPressed(KeyEvent ev) { 
    if (ev.getKeyCode() == KeyEvent.VK_ESCAPE) 
     game.setIsRunning (false); 
} 

請注意,所有這些代碼工作得很好。也就是說,直到我點擊遊戲窗口。我沒有任何地方實現任何MouseListeners。此外,我確實實現了這個代碼:

screen.setFocusTraversalKeysEnabled (false); 

最後,正如你所看到的,我的遊戲可以處理全屏模式和窗口模式。這兩個問題都會發生。

+2

正確的解決方案是使用避免這些問題的焦點的鍵綁定對象。請參閱[keybindings教程](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – Robin

+0

我知道KeyBindings是建議的解決方案。但是,出於好奇,是不是有辦法處理KeyListeners的聚焦問題? – Troncoso

+2

@Troncoso *沒有處理KeyListeners焦點問題的方法*只要你看到焦點改變,就是調用'requestFocusInWindow();',即覆蓋'JFrame#windowDeiconfied(..)'並請求焦點在你的'JPanel '。但Keybindings是解決方案。 +1 Robin –

回答

2

我有我的遊戲相同的配置: 的KeyListener的添加到畫布上,而不是JFrame的

你也可以將它添加到雙方的JFrame和畫布(相同的KeyListener)如果你還在要JFrame中發送的事件

canvas.addKeyListener(this); 

*這樣的:假設你是實現的KeyListener接口

+0

這是我忘記做的事情。非常感謝你。 – Troncoso