0

我需要绑定所有箭头键以执行相同的功能,但每次都按下哪个键。目前我只有通过以下方式按下右箭头键时

DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");

Action MvRight = new AbstractAction()
{
     public void actionPerformed(ActionEvent e)
     {
           //Do whatever here
     }
};
DoneImg.getActionMap().put("RightArrow", MvRight);

但我需要类似的东西

DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");

     Action MvAll = new AbstractAction()
         {
                 public void actionPerformed(ActionEvent e)
              {
                  if (e.keypressed == "LeftArrow")
                         {System.out.println("The left arrow was pressed!");}
                  if (e.keypressed == "RightArrow")
                         {System.out.println("The right arrow was pressed!");}
                  //and so forth
              }
                 };
     DoneImg.getActionMap().put("RightArrow", MvAll);
     DoneImg.getActionMap().put("LeftArrow", MvAll);
     DoneImg.getActionMap().put("UpArrow", MvAll);
     DoneImg.getActionMap().put("DownArrow", MvAll);
4

2 回答 2

11

您要问的实际上是违反直觉的,并且与键绑定 API 的设计背道而驰。

目的是为每个击键提供一个单一的工作单元。在我看来,这表明您应该对每个箭头键进行单独的操作。

它使遵循逻辑、进行更改、根据需要规避操作变得更加容易。

但我是谁说什么是对的:P

如果您看不到它,一种简单的方法是为每个动作分配一个“命令”,然后在actionPerformed触发时询问您。

public TestKeyBindings02() {
    JPanel panel = new JPanel();
    InputMap im = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
    ActionMap am = panel.getActionMap();

    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");

    am.put("RightArrow", new ArrowAction("RightArrow"));
    am.put("LeftArrow", new ArrowAction("LeftArrow"));
    am.put("UpArrow", new ArrowAction("UpArrow"));
    am.put("DownArrow", new ArrowAction("DownArrow"));
}

public class ArrowAction extends AbstractAction {

    private String cmd;

    public ArrowAction(String cmd) {
        this.cmd = cmd;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (cmd.equalsIgnoreCase("LeftArrow")) {
            System.out.println("The left arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("RightArrow")) {
            System.out.println("The right arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("UpArrow")) {
            System.out.println("The up arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("DownArrow")) {
            System.out.println("The down arrow was pressed!");
        }
    }
}
于 2013-03-15T00:23:07.053 回答
2

您无权访问导致执行操作的 KeyStroke。所以需要创建4个Action,并传入一个参数给Action。就像是:

class SomeAction extends AbstractAction
{
    public SomeAction(String name)
    {
        putValue(Action.NAME, name);
        putValue(ACTION_COMMAND_KEY, "Command: " + name);
    }

    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Name: " + getValue(Action.NAME) );
        System.out.println(e.getActionCommand());
    }
}

您将动作添加到 ActionMap 中,例如:

DoneImg.getActionMap().put("RightArrow", new SomeAction("RightArrow"));
DoneImg.getActionMap().put("LeftArrow", new SomeAction("LeftArrow"));
DoneImg.getActionMap().put("UpArrow", new SomeAction("UpArrow"));
DoneImg.getActionMap().put("DownArrow", new SomeAction("DownArrow"));

因此,您共享相同的基本功能,但只需使用标识符标识每个操作。

于 2013-03-15T00:29:08.463 回答