1

我对 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 时,不再调用该操作并且计时器停止?

非常感谢!

4

1 回答 1

3

我想知道您将如何使用 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 增量为正值。

于 2013-05-19T04:10:02.343 回答