当前位置: 首页 > 知识库问答 >
问题:

将多个键绑定附加到java swing对象

韦志新
2023-03-14

我有一个问题,我试图让“玩家”图标在我的JFrame周围移动使用键盘控制。我有一个物体,我想用w、a、s和d键移动。我使用键绑定是因为在我的研究中,它们似乎更适合此任务。

我已经成功地将所有需要的键连接到我的图标上,它们都会调用该操作,唯一的问题是我无法区分按下了哪个按钮。我希望通过在我的动作事件上使用getActionCommand()可以以某种方式实现这一点。到目前为止,它还没有奏效。

我看到的其他示例似乎有解决方案,但它们也有很多额外的代码,注释很少,因此很难确定实际发生了什么。它们似乎都涉及多个类,包括方法和字段。我希望这段代码少一点涉及。

我想知道的是:什么是最好的方式让这个工作?我可以用键绑定吗?这真的需要复杂吗?

我真的很感谢任何帮助,即使这只是我可以用来帮助自己找到答案的来源。

这是我现有的代码:

//My method that gets called by the constructor
//This is all based on a tutorial I found: ftp://ecs.csus.edu/clevengr/133/handouts/UsingJavaKeyBindings.pdf
//player is just an image icon
public static void setUpKeys() {
    InputMap playerMap = player.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

    KeyStroke wKey = KeyStroke.getKeyStroke('w');
    KeyStroke aKey = KeyStroke.getKeyStroke('a');
    KeyStroke sKey = KeyStroke.getKeyStroke('s');
    KeyStroke dKey = KeyStroke.getKeyStroke('d');
    KeyStroke wSprint = KeyStroke.getKeyStroke((char) ('w' + KeyEvent.SHIFT_DOWN_MASK)); //As a side note, what's the best way to get it to move faster when the shift key is held down? Not that important, but if someone happens to know, that'd be great

    playerMap.put(wKey, "moveUp");
    playerMap.put(aKey, "moveLeft");
    playerMap.put(sKey, "moveDown");
    playerMap.put(dKey, "moveRight");
    playerMap.put(wSprint, "moveFast");

    ActionMap playerAction = player.getActionMap();

    playerAction.put("moveUp", playerMoved);
    playerAction.put("moveLeft", playerMoved);
    playerAction.put("moveDown", playerMoved);
    playerAction.put("moveRight", playerMoved);
    playerAction.put("moveFast", playerMoved);
}

以下是我的playerMove动作:

static Action playerMoved = new AbstractAction() {
    //This isn't important, just put it in instead of suppressing the warning
    private static final long serialVersionUID = 2L; 

    //This doesn't do anything yet, just gives console confirmation
    public void actionPerformed(ActionEvent e) {
        System.out.println("Activated");

        //Here's what I was talking about with the getActionCommand() not working
        if (e.getActionCommand().equals("moveUp")) {
            System.out.println("up");
        }
    }
};

如果有人需要我代码的任何其他部分,我可以提供它。我只是想把它减少到我认为对这个问题很重要的程度

共有1个答案

郏稳
2023-03-14

我希望通过在我的动作事件上使用getActionCommand()可以以某种方式实现这一点。

您不想这样做,因为您将尝试使用“操作命令”进行“处理”。这不是一个好的设计,因为它会导致嵌套的if/else语句。

相反,您需要创建一个接受参数来控制移动的动作。所以你需要4个单独的动作来控制动作。有关此方法的完整工作示例,请参阅使用键盘在运动中找到的MotionWithKeyBindings示例。

它演示了如何通过为Action指定参数来使简单的Action可重用。这提供了比您当前的Action更大的灵活性。

注1:

您在Action中使用以下调试代码:

System.out.println("Activated");

与其简单地显示硬编码值,不如这样做

System.out.println( e.getActionCommand() );

在这种情况下,您应该注意到值是“a, s, w, d”,这是您用来调用ActionKeyStroke

所以这意味着if语句应该测试上述任何一个字符,而不是字符串“moveUp”,它是用于标识ActionMap中的Action的字符串。

然而,如上所述,这不是您应该使用的解决方案,我只是想更好地解释“动作命令”是如何确定的。

注2:

您可能希望使用单个ActiongetActionCommand()方法的唯一时间是当您希望将“action命令”用作Action的“数据”时。

有关此方法的示例,请查看:如何将actionlistenerand actioncommand放置到多个JButton。这是一个简单数字输入面板的示例,其中按下的数字键被添加到文本字段。因此,关键字符成为文本字段的数据,不需要特殊处理。

 类似资料:
  • 问题内容: 这是我正在使用的 json对象 我希望将此作为另一个键值对: 我尝试了concat,但是使用||给了我结果 符号,我cdnt进行迭代。我用过溢漏,但只删除了逗号。 如何将密钥对值添加到现有的json对象?我正在使用JavaScript。 问题答案: 这是最简单的方法,对我有用。

  • 我有一个配置对象。使用这个config对象,我通过在这个对象的键上附加一个字符串来填充必需的元素。我需要更新值的帮助

  • 我正在开发一个简单的Java程序来完成一些简单的mySQL内容。它有一个用JavaFX制作的小GUI。 GUI的控制器有一个SimpleBoleanProperty,我们称之为X,它指示到数据库的连接状态。我将一些简单的东西绑定到它,比如按钮的disableProperty so send querys,如果没有连接,应该禁用它。到现在为止,一直都还不错。 我有一个标签,用于执行以下操作: 如果X

  • 我有一个客户端程序,它调用服务器上的远程方法。现在,我想根据客户端发送的IP地址创建3个不同的服务器。 问:我应该创建3个不同的远程对象并将它们绑定到同一个注册表吗?或者我应该创建3个不同的远程对象并将它们绑定到各自的注册表?? 我现在做的是一个远程对象,并将所有3个对象绑定到同一个注册表。 r.bind("NA", obj); r.bind("欧盟", obj); r.bind("AS", ob

  • 问题内容: 假设我有一个java.net.URL对象,它指向 要么 在某处有一些帮助程序可以在其中添加一些相对URL吗?例如append 或get: 问题答案: 有一个带有基础和规范的构造函数。 或者,更严格地遵守标准,并具有执行相同操作的方法。创建一个从你的使用。

  • 立即想到的解决方案是创建一个跟踪所有热键的arraylist,并让keylistener每次迭代它,以及另一个带有关联按钮的arraylist的arraylist。 有没有更优雅、更直接的方法?