Java Keybindings [closed]

怎甘沉沦 提交于 2019-11-28 01:45:12

What you're asking is actually counter intuitive and goes against the design of the key bindings API.

The intention is to provide a single unit of work per key stroke. That would, in my mind, suggest that you should have separate action for each arrow key.

It makes it much easier to follow the logic, make changes, circumvent the actions as you need.

But who am I to say what's right :P

If you can't see you way around it, one way would simple be to assign a "command" to each action that you could then interrogate when the actionPerformed is fired.

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!");
        }
    }
}

You don't have access to the KeyStroke that caused the Action to be executed. So you need to create 4 Actions and pass in a parameter to the Action. Something like:

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());
    }
}

You add the Actions to the ActionMap like:

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"));

So you share the same basic functionality,but just identify each Action with an identifier.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!