【问题标题】:keyReleased() method with Key Bindings in Java?Java 中带有键绑定的 keyReleased() 方法?
【发布时间】:2013-05-19 03:23:15
【问题描述】:

我对 Key Bindings 有点陌生,因为直到最近 KeyListeners 被证明是我最大的障碍时,我一直在使用 KeyListeners。我想知道您将如何使用 KeyBindings 编写类似 keyReleased 的事件。 KeyListeners 提供了三种简单的方法:keyPressed、keyTyped 和 keyReleased,但我对如何使用 Key Bindings 实现这一点有点困惑。

基本上,当用户按下 UP 时,我希望一个对象向上移动。但是当用户松开 UP 时,物体应该会自动向下移动以模拟基本重力。这是我显示 UpAction 类的一些代码。

class UpAction extends AbstractAction
{
    public void actionPerformed(ActionEvent tf)
    {
        north = true;
        helitimer.start();
        helitimer.start();
        helitimer2.start();
        repaint();
    }
}

三个 helitimer 是 Timer 对象,它们启动一系列 Timer 以连续平滑地增加对象的 y 位置。当调用 upAction 动作时,调用 UpAction 类并启动三个计时器以移动对象。

无论如何我可以做到,所以当用户释放 UP 时,不再调用该操作并且计时器停止?

非常感谢!

【问题讨论】:

标签: java swing actionlistener key-bindings keyrelease


【解决方案1】:

我想知道如何使用 KeyBindings 编写类似 keyReleased 的事件

与 keyPressed 事件完全相同。区别在于KeyStroke。阅读 KeyStroke API,它展示了如何为 keyReleased 事件创建 KeyStroke。根据您想要创建 KeyStroke 的方式,有几种不同的方法。

KeyStroke 方法假定 keyPressed,因此您需要为 keyReleased 事件添加额外的参数或额外的关键字。我不知道您使用哪种方法来创建 KeyStroke,所以我无法告诉您确切的更改。详情请查看 API。

三个 helitimer 是 Timer 对象,它们启动一系列 Timer 以连续平滑地递增对象的 y 位置

您不需要 3 Timer。 One Timer 应该可以令人满意地工作。

无论如何我可以做到,所以当用户释放 UP 时,不再调用该操作并且计时器停止?

如果您可以在 keyPress Action 中“启动”计时器,那么您可以在 keyReleasedAction 中“停止”计时器。您所需要的只是对 Timer 的引用。根据您发布的代码,您已经将 Timer 定义为类变量,因此这应该不是问题。

但是当用户松开 UP 时,物体应该会自动向下移动以模拟基本重力

在我看来,您需要另一个计时器来执行此操作。

另一种选择是始终运行计时器。然后当按下 UP 键时,使 Y 增加一个负值。当释放 UP 键时,您使 Y 增量为正值。

【讨论】:

  • 谢谢,我会参考API。我发现 1 个计时器不能提供对象所需的速度。而增加y变量的增量只会让程序闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2012-02-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多