关于Java中的键绑定

关于Java中的键绑定,java,awt,key-bindings,Java,Awt,Key Bindings,这里的人一直建议我在Java2D游戏中使用密钥绑定,而不是密钥侦听器 所以我学会了它,我想知道我是否正确理解如何使用它 假设我有一个游戏,有两个游戏,每个玩家可以按5个按钮 玩家1: 向上箭头-向前移动 左箭头-更改移动角度 右箭头-更改移动角度 空间键控发射导弹 L键-发射二级导弹 玩家2: W键-前进 关键点-改变运动角度 D键-改变运动角度 CAPS-LOCK钥匙-发射导弹 “Z”键发射二级导弹 如果我想让程序对每一次不同的按键做出不同的反应,那么我必须这样做:(?) 在内部创建扩

这里的人一直建议我在Java2D游戏中使用密钥绑定,而不是密钥侦听器

所以我学会了它,我想知道我是否正确理解如何使用它

假设我有一个游戏,有两个游戏,每个玩家可以按5个按钮

玩家1:

  • 向上箭头-向前移动
  • 左箭头-更改移动角度
  • 右箭头-更改移动角度
  • 空间键控发射导弹
  • L键-发射二级导弹
玩家2:

  • W键-前进
  • 关键点-改变运动角度
  • D键-改变运动角度
  • CAPS-LOCK钥匙-发射导弹
  • “Z”键发射二级导弹
如果我想让程序对每一次不同的按键做出不同的反应,那么我必须这样做:(?)

  • 在内部创建扩展AbstractAction的新嵌套类 运行大多数游戏逻辑的类
  • 创建的实例 每一个10新类,并将每个类绑定到一个键
  • 这是正确的吗?只为按钮创建10个新类真的合乎逻辑吗? 我想知道我是否正确理解如何使用键绑定,这样我就可以开始用它编程了

    谢谢

    取自


    从个人角度来看,当我使用keyBindings时,我会为每个动作创建一个扩展abstractAction的内部类,然后创建这个内部类的一个实例,并将它绑定到一个键,如
    put(“left”,ActionLeft)。所以基本上我完成了你描述的两个步骤,这很有效


    您也可以创建匿名类的实例,然后以同样的方式绑定这些实例。

    个人而言,当我使用键绑定时,我会为每个操作创建一个扩展abstractAction的内部类,然后创建这个内部类的实例,并将其绑定到一个键,如
    put(“left”,ActionLeft)。所以基本上我完成了你描述的两个步骤,这很有效

    您还可以创建匿名类的实例,然后以相同的方式绑定这些实例

    “这是正确的吗?只为按钮创建10个新类真的合乎逻辑吗?”

    答案是肯定的。您确实需要创建10个不同的实例。这并不难。您可以创建一个helper类,也可以复制并粘贴类似的内容

    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 leftAction=new AbstractAction(){
    已执行的公共无效操作(操作事件e){
    //当左键按下时做些什么;
    }
    };
    InputMap InputMap=panel.getInputMap(JPanel.WHEN在聚焦窗口中);
    ActionMap ActionMap=panel.getActionMap();
    inputMap.put(KeyStroke.getKeyStroke(“左”),“leftAction”);
    actionMap.put(“leftAction”,leftAction);
    “这是正确的吗?只为按钮创建10个新类真的合乎逻辑吗?”

    答案是肯定的。您确实需要创建10个不同的实例。这并不难。您可以创建一个helper类,也可以复制并粘贴类似的内容

    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 leftAction=new AbstractAction(){
    已执行的公共无效操作(操作事件e){
    //当左键按下时做些什么;
    }
    };
    InputMap InputMap=panel.getInputMap(JPanel.WHEN在聚焦窗口中);
    ActionMap ActionMap=panel.getActionMap();
    inputMap.put(KeyStroke.getKeyStroke(“左”),“leftAction”);
    
    actionMap.put(“leftAction”,leftAction);我知道我需要创建10个不同的实例。但是我需要创建10个不同的类吗?(每个人都有一个实例?)你在上面写了什么:它做什么?它是否创建了一个名为leftAction的新类,扩展了AbstractAction?或者它创建了AbstractAction的一个新实例,然后覆盖了该特定实例的actionPerformed()?从技术上讲,使用上面的代码,您正在创建一个annonymous类。对于不同的操作,您必须重复我代码的顶部部分10次。这是一个匿名类所能做的。是,
    leftAction
    是类的变量
    AbstractAction
    是一个需要重写
    actionPerformed
    的类,就像ActionListener类一样,所以要回答我在第二条评论中的问题:您上面写的等于“创建一个名为leftAction的新类,它扩展了AbstractAction”?或者它只是AbstractAction的另一个实例?我知道我需要创建10个不同的实例。但是我需要创建10个不同的类吗?(每个人都有一个实例?)你在上面写了什么:它做什么?它是否创建了一个名为leftAction的新类,扩展了AbstractAction?或者它创建了AbstractAction的一个新实例,然后覆盖了该特定实例的actionPerformed()?从技术上讲,使用上面的代码,您正在创建一个annonymous类。对于不同的操作,您必须重复我代码的顶部部分10次。这是一个匿名类所能做的。是,
    leftAction
    是类的变量
    AbstractAction
    是一个需要重写
    actionPerformed
    的类,就像ActionListener类一样,所以要回答我在第二条评论中的问题:您上面写的等于“创建一个名为leftAction的新类,它扩展了AbstractAction”?或者它只是抽象行为的另一个实例?