Java键绑定
我需要绑定所有的箭头键来执行相同的功能,但每次都要获取按下的键。目前,只有通过以下按钮按下右箭头键时,我才有Java键绑定,java,key-bindings,Java,Key Bindings,我需要绑定所有的箭头键来执行相同的功能,但每次都要获取按下的键。目前,只有通过以下按钮按下右箭头键时,我才有 DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow"); Action MvRight = new AbstractAction() { public void actionPerformed(ActionEvent
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);
您所问的实际上是违反直觉的,并且与密钥绑定API的设计背道而驰 其目的是为每个按键行程提供一个单独的工作单元。在我看来,这意味着每个箭头键都应该有单独的操作 它使遵循逻辑、进行更改、根据需要规避操作变得更加容易 但是,我是谁,说什么是对的呢 如果你看不到你的方法,一种简单的方法是给每个动作分配一个“命令”,然后在触发
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!");
}
}
}
您无权访问导致执行操作的按键。因此,您需要创建4个动作,并向该动作传递一个参数。比如:
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"));
因此,您共享相同的基本功能,但只需使用标识符标识每个操作。您已经发布了所需内容,但我们需要了解更多。例如,你被困在哪里?什么不起作用?在我的答案中可以找到一个键绑定的例子。关于这个问题的一个问题是:我正在使用一个JFrame创建一个游戏,里面有一个JPanel。我还应该把钥匙绑在面板上吗?还是我应该把它放在框架上?就个人而言,你应该使用游戏的顶部容器。您应该避免从顶级容器(如
JFrame
)扩展,而是将应用程序容器化为JPanel
,这样您可以更好地控制应用程序的部署方式。谢谢,MP。当我试图解决作为箭头键的ActionEvents的KeyEvents的混乱时,这让我的生活变得简单多了。