![](/img/trans.png)
[英]How do I guarantee that a Java Swing JDialog will maintain focus and register all key presses in game?
[英]How can I listen for key presses (within Java Swing) across all components?
我想聽一些關鍵組合,比如Control + S,而不是在我的Swing應用程序中為每個組件添加關鍵監聽器。 我怎樣才能做到這一點?
有可能的。
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
System.out.println("Got key event!");
return false;
}
});
這將抓住所有關鍵事件。 返回false允許鍵盤焦點管理器恢復正常的鍵事件調度到各種組件。
如果你想捕捉關鍵的組合,你可以保留一組“按下的鍵”。 每當按下一個鍵時,將其添加到該組中並檢查該組中已有的鍵。 釋放鑰匙后,將其從設備中取出。
非常簡單我的朋友:你所要做的就是創建一個KeyEventDispatcher類並注冊到KeyboardFocusManager C.1
然后解析並提取狀態和密鑰信息,參見:C.2奇怪的是,你必須通過ThatEvent.getID()獲得KEY STATE;
看起來就像我的一個小姐。
/////////////////////////////////////////////////////////////////////////////////////////// C.1)
KeyDispatcher ThisKeyDispatcher = new KeyDispatcher();
KeyboardFocusManager ThisKbFocusMngr = KeyboardFocusManager
. getCurrentKeyboardFocusManager();
ThisKbFocusMngr . addKeyEventDispatcher(ThisKeyDispatcher);
return ThisKeyDispatcher;
///////////////////////////////////////////////////////////////////////////////////////////
C.2
public static class KeyDispatcher implements KeyEventDispatcher {
public boolean dispatchKeyEvent(final KeyEvent ThatEvent) {
KeyboardFocusManager ThisKbFocusMngr = null;
Component ThisComponent = null;
Container ThisRoot = null;
Window ThisWindow = null;
int ThisKeyStateEvent = 0;
try {
ThisKbFocusMngr = KeyboardFocusManager . getCurrentKeyboardFocusManager();
ThisComponent = ThisKbFocusMngr . getFocusOwner();
ThisRoot = ThisKbFocusMngr . getCurrentFocusCycleRoot();
ThisWindow = ThisKbFocusMngr . getActiveWindow();
ThisKeyStateEvent = ThatEvent.getID(); // i.e. KeyEvent.KEY_RELEASED
if(false == ThatEvent.isConsumed()) {
boolean RetBool = false;
if((KeyEvent.VK_BACK == ThatEvent.getKeyCode())) {
RetBool = true;
} else {
RetBool = m_CallSomeoneEvent(ThatEvent);
}
if(RetBool) {
ThatEvent.consume();
return true;
}
}
}
catch( Throwable e ) {
LogThis(". ", e);
}
return false;
}
}
我認為沒有辦法像你想要的那樣添加一個“全局”關鍵監聽器。 這個有類似問題的論壇帖子支持我。 您只需要將它們添加到每個組件。 這應該只需要做一次,所以我想你可以把它完成並繼續前進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.