Създавам 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