Java KeyListeners/KeyBinding-清除缓冲区-Java游戏开发

Java KeyListeners/KeyBinding-清除缓冲区-Java游戏开发,java,keyboard,Java,Keyboard,我正在开发一个Java游戏,我已经到了一个关键点,我在KeyListeners/KeyBinding方面遇到了问题。我主要想做的是在动画出现时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的 我现在得到的是,我按下动画的键,动画开始,然后我按下另一个键来执行其他功能。它被添加到keyboardlistener的堆栈/队列(?),并在第一个动画完成时触发 我正在使用一个实现KeyListener的JPanel 要了解代码,请执行以下操作: public void keyPresse

我正在开发一个Java游戏,我已经到了一个关键点,我在KeyListeners/KeyBinding方面遇到了问题。我主要想做的是在动画出现时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的

我现在得到的是,我按下动画的键,动画开始,然后我按下另一个键来执行其他功能。它被添加到keyboardlistener的堆栈/队列(?),并在第一个动画完成时触发

我正在使用一个实现KeyListener的JPanel

要了解代码,请执行以下操作:

    public void keyPressed(KeyEvent arg0) {
      //Prevents Repeated keys
      pressed.add(arg0);
      if (pressed.size() == 1) {
            int key = ((KeyEvent) pressed.toArray()[0]).getKeyCode();
            if (key == KeyEvent.VK_ENTER) {
                doSomeAnimation();
            } else if (key == KeyEvent.VK_SPACE) {
                doADifferentAnimation();
            } 
            Update();
     }
}
我尝试过的事情:

1) 在调用动画之前,在JPanel上设置可聚焦(false)。然后设置可聚焦(true)并在完成后获取焦点

2) 使用布尔值跟踪动画发生的时间

3) 使用键绑定

无论我使用什么方法,我总是会遇到这样的问题:当动画发生时,我仍然会从键盘接收输入。然后,一旦动画完成,它将转到堆栈/队列(?)中的下一个元素并处理该元素。此外,这些动画需要多次出现(因此,使用一组布尔值来验证是否已经执行了动画是没有帮助的)

因此,如果你有任何想法或帮助(或地方指给我),将不胜感激


一些额外的信息:Java1.6、IDEEclipse、MVC结构。(这里讨论的是控制器/模型)

假设您的动画由的实例驱动,这里讨论的队列是,它按照计时器的“排队顺序”运行事件。因为阻止主机平台上的其他设备唤起您的侦听器是不切实际的,所以您必须在应用程序中跟踪效果。作为一个具体的例子,这有几个重载模型的
move()
方法来处理来自不同来源的输入:键盘、鼠标或动画计时器。可以打开或关闭计时器以查看其效果。这可以用自定义实现取代
事件队列
,也可以提供一些见解。

假设动画是由的实例驱动的,所讨论的队列是,该队列通过
计时器以“与事件排队相同的顺序”运行事件。因为阻止主机平台上的其他设备唤起您的侦听器是不切实际的,所以您必须在应用程序中跟踪效果。作为一个具体的例子,这有几个重载模型的
move()
方法来处理来自不同来源的输入:键盘、鼠标或动画计时器。可以打开或关闭计时器以查看其效果。这用自定义实现取代了
EventQueue
,也提供了一些见解。

@mKorbel:Good observation;突出了不使用计时器时通常会出现的复杂性。我没有使用计时器,但感谢您的帮助。您提供的链接非常有用。:)我通过混合使用替换eventqueue和设置focusable解决了这个问题。@mKorbel:观察效果很好;突出了不使用计时器时通常会出现的复杂性。我没有使用计时器,但感谢您的帮助。您提供的链接非常有用。:)我通过混合使用替换eventqueue和设置focusable解决了这个问题。