我对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时,不再调用动作并且定时器停止?
非常感谢!
答案 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增量为正值。