Я создаю InputMap и ActionMap для привязки ключей к методам. Многие ключи будут делать аналогичные вещи. У меня есть одна запись в InputMap для каждого связанного ключа. Я хотел бы связать несколько записей InputMap с одной и той же записью ActionMap и использовать параметр ActionEvent в методе AbstractAction.actionPerformed(ActionEvent event), чтобы определить, какая клавиша была нажата/отпущена/набрана. Я просмотрел 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;
}
}
};
Action
не должно волновать, как он был активирован. - person MadProgrammer   schedule 07.01.2013KeyListener
. Разработайте лучшуюAction
иерархию. Если, например, вам необходимо обеспечить действия по перемещению, спроектируйте базовый класс, который знает, что он меняет и как он это меняет (т. е. изменяет позицию x на -1). Для каждой клавиши движения назначьте требуемое действие, установленное вашими требованиями. - person MadProgrammer   schedule 07.01.2013