我读到使用KeyBindings比使用KeyListeners更好。我看到KeyBindings如何对特定键的特定反应有用;但我也试图检测键盘上任意键的按下/释放:有没有办法用KeyBindings做到这一点?
例如,我会正常使用KeyBindings来处理单个键,如下所示:
InputMap iMap = component.getInputMap();
ActionMap aMap = component.getActionMap();
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter without modifiers");
aMap.put("enter without modifiers", new AbstractAction(){
public void actionPerformed(ActionEvent a){
System.out.println("Enter pressed alone");
});
因此,我正在考虑使用这样的方法来检测任何按键:
iMap.put(KeyStroke.getKeyStroke(KeyEvent.KEY_PRESSED, 0), "any key was pressed");
aMap.put("any key was pressed", new AbstractAction(){
public void actionPerformed(ActionEvent a){
System.out.println("some key was pressed, regardless of which key...");
});
有没有办法实现这个目标?
另外,有没有办法用任何修饰符组合捕获它们的KeyBinding?例如。无论是否保留修饰符,或者如果同时保持任何组合的ctrl-alt等,都可以映射Enter-action?
非常感谢, 丹
答案 0 :(得分:5)
我看到KeyBindings如何对特定键的特定反应有用;
是的,那就是你要使用键绑定
但我也试图检测键盘上任意键的按下/释放:有没有办法用KeyBindings做这个?
不,键绑定不用于此目的。
另外,有没有办法用任何修饰符组合来捕捉它们的KeyBinding?
不,再次绑定是针对特定的KeyStroke。因此,您需要编写一个方法来为每个组合添加绑定。请注意,顺序无关紧要。这是Shift + Alt与Alt + Shift
相同在大多数情况下,Key Bindings是首选方法。在你的情况下,它不是。
如果您正在侦听具有焦点的特定组件上的KeyEvent,则KeyListener可能是合适的。
或者您希望在全球范围内倾听KeyEvents,然后根据您的具体要求,您可以查看Global Event Listeners或Global Event Dispatching。