我正在开发Java游戏,现在我遇到了KeyListeners / KeyBinding问题。我基本上想做的是在发生动画时暂时禁用键盘/不允许更多输入。此动画是通过更新数据生成的。

我现在得到的是,我按下了动画的键,动画开始了,然后我按下了执行其他功能的另一个键。它被添加到键盘监听器的堆栈/队列(?)中,并在第一个动画结束时触发。

我正在使用实现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上设置focusable(false)。然后设置focusable(true)并在完成时获取焦点。

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

3)使用按键绑定。

无论我使用哪种方法,总会遇到一个问题,即在发生动画时仍会从键盘输入输入。然后,一旦完成动画,它将转到堆栈/队列(?)中的下一个元素并进行处理。同样,这些动画需要发生不止一次(因此,使用布尔数组验证它是否已经执行不会有帮助)。

因此,如果您有任何想法或帮助(或需要指出的地方),将不胜感激。

一些附加信息:Java 1.6,IDE Eclipse,MVC结构。 (有问题的是控制器/模型)

最佳答案

假设动画是由javax.swing.Timer实例驱动的,则所讨论的队列是EventQueue,该队列以Timer排队的顺序运行事件。因为阻止主机平台上的其他设备引起监听器是不切实际的,所以您必须在应用程序中跟踪效果。作为具体示例,此game具有模型的move()方法的一些重载,以处理来自不同来源(键盘,鼠标或动画计时器)的输入。可以打开或关闭计时器以查看其效果。该example通过自定义实现代替EventQueue,也可能提供一些见识。

10-04 13:40