キーをメソッドにバインドするために InputMap と ActionMap を構築しています。キーの多くは同様のことを行います。バインドされたキーごとに InputMap に 1 つのエントリがあります。複数の 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;
}
}
};