【问题标题】:KeyListener is not triggered when releasing key after multiple keys have been pressed simultaniously多个键同时按下后释放键时不触发 KeyListener
【发布时间】:2012-12-29 13:41:13
【问题描述】:

我正在编写一个使用键侦听器的小型应用程序。当一个特定的键被按下时,定时器启动,当该键被释放时,定时器停止。

现在这只有在同时按下一个键时才能完美运行。当我同时按下 3 个键时,所有三个计时器都启动得很好。我遇到的问题是一个接一个地释放键。我尝试使用 InputMap 和 ActionMap,但遇到了另一个问题。

  import java.awt.event.*; 
  import javax.swing.*;
  public class KeyTest extends JFrame implements KeyListener{
  private static final int UP_TIMER_DELAY = 200;
  // a timer for button "Z"
  private Timer upTimer;
  // a timer for button "X"
  private Timer upTimer2;

  public static void main(String[] args) 
  { 
     new KeyTest(); 
  }

  public KeyTest() 
  { 
     this.addKeyListener(this);
     this.setSize(800,600); this.setVisible(true); 
  }


  public void keyPressed(KeyEvent e) 
  {
  //When Z is pressed
     if(e.getKeyCode()==90)
     {
        if (upTimer != null && upTimer.isRunning()) {
           return;
        }
        System.out.println("Button_Z is pressed");

        upTimer = new Timer(UP_TIMER_DELAY, 
              new ActionListener() {

                 @Override
                    public void actionPerformed(ActionEvent e) {

                 }
              });       
        //Starting the timer for Button "Z" if pressed      
        upTimer.start();
     } 
     else {
        if (upTimer != null && upTimer.isRunning()) {
           upTimer.stop();
           upTimer = null;
        } 
     }
    //When X is pressed
     if(e.getKeyCode()==88)
     {
        if (upTimer2 != null && upTimer2.isRunning()) {
           return;
        }
        System.out.println("Button_X is pressed");

        upTimer2 = new Timer(UP_TIMER_DELAY, 
              new ActionListener() {

                 @Override
                    public void actionPerformed(ActionEvent e) {

                 }
              });           
        upTimer2.start();
     } 
     else {
        if (upTimer2 != null && upTimer2.isRunning()) {
           upTimer2.stop();
           upTimer2 = null;
        }
     }
  }

  public void keyReleased(KeyEvent e) 
  {
  //When Z is released
     if(e.getKeyCode()==90)
     {

        if (upTimer != null && upTimer.isRunning()) {
           upTimer.stop();
           upTimer = null;
           System.out.println("Button_Z is released");
        }   
     }

     //When X is realeased
     else if(e.getKeyCode()==88)
     {

        if (upTimer2 != null && upTimer2.isRunning()) {
           upTimer2.stop();
           upTimer2 = null;
           System.out.println("Button_X is released");
        }  
     }
  }

  public void keyTyped(KeyEvent e) 
  { 
  // Do stuff. 
  } 
  }

【问题讨论】:

  • “我尝试使用 InputMap 和 ActionMap,但遇到了另一个问题。” 解决这个问题会更有成效。
  • Aaaaaaa 有什么问题?
  • @looper 当我按住“Z”时它打印“Button_Z 被按下”,同时按住“Z”键然后按住“X”,它打印另一行“Button_X 被按下” .现在问题是当我释放“Z”键时,它不会打印任何东西,尽管它应该打印“Button_Z is released”。尝试编译并运行它,看看我真正的意思。

标签: java swing awt keylistener


【解决方案1】:

当您自己按下另一个键时取消计时器。

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=90
Button_Z is pressed
Canceling Button_X timer
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=90
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=90
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=88
Canceling Button_Z timer
Button_X is pressed
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=88
Button_X is released
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=90 // but timer already canceled

【讨论】:

  • 非常感谢,您帮助我了解了 JVM 是如何执行这段代码的。
猜你喜欢
  • 2013-01-23
  • 2011-02-07
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多