在Java中使用Key Bindings的keyReleased()方法?

时间:2013-05-19 03:23:15

标签: java swing actionlistener key-bindings keyrelease

我对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();
    }
}

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

无论如何我可以这样做,当用户释放UP时,不再调用动作并且定时器停止?

非常感谢!

1 个答案:

答案 0 :(得分:3)

  

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

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

KeyStroke方法假定为keyPressed,因此您需要为keyReleased事件添加其他参数或其他关键字。我不知道您使用哪种方法来创建KeyStroke,因此我无法告诉您确切的更改。检查API以获取详细信息。

  

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

你不需要3个计时器。一个计时器应该可以令人满意地工作。

  

无论如何我可以这样做,当用户释放UP时,不再调用动作并且定时器停止?

如果你可以"开始"你的keyPress动作中的一个计时器,然后你可以"停止" keyReleasedAction中的Timer。您只需要参考Timer。根据您发布的代码,您已将Timer定义为类变量,因此这不应成为问题。

  

但是当用户释放UP时,对象应该自动向下移动以模拟基本重力

听起来像你需要另一个Timer才能做到这一点。

另一个选择是始终运行Timer。然后按下UP键时,Y增量为负值。释放UP键后,Y增量为正值。