这里的人们一直建议我在Java 2D游戏中使用Key Binding而不是Key Listener。
所以我学会了它,我想知道我是否正确理解如何使用它。
让我们说我有一个游戏,有两个游戏,每个玩家可以按5个按钮。
玩家1:
玩家2:
如果我希望程序对每个不同的按键操作做出不同的反应,那么这就是我要做的事情:(?)
这是对的吗?为推按钮创建10个新类是否合乎逻辑? 我想知道我是否正确理解如何使用Key Bindings,所以我可以开始使用它进行编程。
由于
答案 0 :(得分:3)
“这是正确的吗?仅为推按钮创建10个新类是否合乎逻辑?”
答案是肯定的。您需要创建10个不同的实例。这并不困难。你可以创建一个帮助类,也可以只复制和粘贴这样的东西
Action leftAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
// do something when left button pressed;
}
};
InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction");
actionMap.put("leftAction", leftAction); <----
对于每个不同的操作,只需复制并粘贴Action
代码,更改变量以及要执行的操作,然后相应地输入InputMap
和ActionMap
。
我对不同的场景使用两种方式。对于图形我更喜欢上述方式。对于像菜单这样的东西,我倾向于使用单独的类
答案 1 :(得分:2)
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!");
}
}
}
取自here
答案 2 :(得分:1)
Personaly,当我使用keyBindings时,我会为每个动作创建一个扩展abstractAction的内部类,然后创建这个内部类的实例并将其绑定到像put("left", ActionLeft);
这样的键。所以基本上我做了你描述的两个步骤,并且有效。
您也可以创建匿名类的实例,然后以相同的方式绑定这些实例。