我正在构建一个 InputMap 和 ActionMap 来将键绑定到方法。许多键会做类似的事情。对于每个绑定键,我在 InputMap 中有一个条目。我想将几个 InputMap 条目与同一个 ActionMap 条目相关联,并使用 AbstractAction.actionPerformed(ActionEvent event) 方法中的 ActionEvent 参数来确定按下/释放/键入了哪个键。我查看了 getID(),测试了 ActionEvent 是否是 KeyEvent(不是)。有没有办法做到这一点,或者我必须进行不同的重构,以便每个唯一的 ActionMap 条目设置一个参数,然后调用我的(参数化)方法?
这是有效的(但很冗长):
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),"myRightHandler");
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),"myLeftHandler");
getActionMap().put("myRightHandler",new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Typed Right Arrow");
}
});
getActionMap().put("myLefttHandler",new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Typed Left Arrow");
}
});
这是我想做但找不到魔法的事情:
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),"myGenericHandler");
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),"myGenericHandler");
getActionMap().put("myGenericHandler",new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
// determine what key caused the event...
// evt.getKeyCode() does not work.
int keyCode = performMagic(evt);
switch (keyCode) {
case KeyEvent.VK_RIGHT:
System.out.println("Typed Right Arrow");
break;
case KeyEvent.VK_LEFT:
System.out.println("Typed Left Arrow");
break;
default:
System.out.println("Typed unknown key");
break;
}
}
};