【问题标题】:how to check if the key is being pressed continuously?如何检查按键是否被连续按下?
【发布时间】:2016-08-10 23:27:44
【问题描述】:

我试过了,但是没有用。

我必须在按键时运行动画。

我的代码:

case KeyEvent.VK_RIGHT:

while(KeyEvent.KEY_PRESSED){

  estado = ANDA0;

  posX += 10;

}

estado = PARADO;

break;

【问题讨论】:

  • 使用KEY_RELEASED事件

标签: java


【解决方案1】:

您的 while 循环将完全压倒 GUI 事件线程,阻止任何动作发生,包括动画动作和键读取事件。相反,我建议您:

  • 如果这是 Swing 而不是 KeyListener,则使用 Key Bindings
  • 更改使用 Swing Timer 作为动画循环,而不是线程冻结 while (true) 循环。
  • 在按键时(从键绑定),将状态更改为状态字段
  • 在密钥释放时(再次从绑定),恢复同一字段的状态
  • 根据上面更改的状态字段的状态确定动画循环中发生的情况。

例如,请看this answer and example code of mine

【讨论】:

    【解决方案2】:

    像这样使用KEY_RELEASED 事件应该可以解决问题:

        case KeyEvent.VK_RIGHT:
        if (KeyEvent.getID() == KeyEvent.KEY_PRESSED)
            bool = true;
    
        while(bool){
    
            estado = ANDA0;
            posX += 10;
            if (KeyEvent.getID() == KeyEvent.KEY_RELEASED)
            bool = false;
    
        }
    
        estado = PARADO;
    
      break;
    

    【讨论】:

    • 出于好奇,这是如何工作的?在我所知道的 Java 中,在事件处理线程中忙于等待事件会使程序冻结。
    • @cHao 我假设因为他使用了switch-case,所以该键已被按下。
    • 是的,但它必须在您收到KEY_RELEASED 事件之前发布。这意味着您正在等待新的活动。
    • 它会评估为 false forever,我想,因为你没有返回,这意味着你正在占用事件处理线程,这意味着下一个事件将永远不会得到处理。这就是我问的原因——这似乎很奇怪。
    • 不过,你还在忙着等待。你已经拥有的那个事件不会改变它的类型。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多