2013-10-18 25 views
0

我想添加鍵盤快捷鍵到我的遊戲使用SWING。到目前爲止,我一直在使用下面的代碼:KeyEventDispatcher和焦點

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
      .addKeyEventDispatcher(new KeyEventDispatcher() { 


       @Override 
       public boolean dispatchKeyEvent(KeyEvent e) { ... } 

出於測試目的,我想創建此應用程序(測試的網絡遊戲)的兩個實例。問題在於,當我使用熱鍵時,非聚焦窗口抓住焦點。 (即後來創建的窗口。)

我懷疑問題是,

KeyboardFocusManager.getCurrentKeyboardFocusManager() 

是一個靜態方法(這兩種情況下都從同一個JVM啓動)。

我可以考慮的唯一的其他選擇是讓每個組件都將它們的鍵事件委託給祖先JFrame,並在一個地方處理它們,但這會涉及很多鍋爐代碼,我認爲這是將是一個醜陋的解決方案。

另外,問題不會發生在正常的遊戲過程中,它只會讓我煩惱,而我正在測試。

+0

這是今天Native OS的基本屬性,默認最後打開的窗口是focus ownser – mKorbel

回答

5

我想鍵盤快捷方式添加到我的遊戲,使用Swing

,那麼你應該使用Key Bindings

+0

這是我反對的第二種選擇,但似乎沒有辦法繞過它。 (也許與WHEN_ANCESTOR_OF_FOCUSED_COMPONENT選項沒有那麼差。) – zslevi

+0

鍵綁定是最靈活的IMO。但他們是挑剔的。特別是如果你的按下和釋放的行動是不同的,請確保你測試了很多。我遇到了問題,特別是在OS X上。Command鍵(包含getDefaultMenuMask()和KeyEvent.META_MASK)特別具有一些奇怪的行爲。 – Radiodef

+0

其實我意識到我以前的評論有點愚蠢:我寫這篇文章的原意是使用傳統的KeyListeners。鍵綁定是完全不同的,因爲它們不像KeyListeners那樣給你一個KeyEvent對象。這給我帶來了一些麻煩,因爲我正在「手動」地將我的事件委派給其他組件(而不考慮組件佈局層次結構),並且在重寫時我沒有任何委派。我並不是說改變的工作太多,但它決定了一種不同的「架構」。 – zslevi