2013-01-15 144 views
1

我正在编程使用按键监听器的小应用程序。当一个特定的键被按下时,一个定时器被启动,当该键被释放时,定时器停止。同时按下多个按键后释放按键时,未触发KeyListener

现在只有当一个按键被按下时,它才能正常工作。当我同时按下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. 
    } 
    } 
+0

*“我尝试过使用InputMap和ActionMap,但是我遇到了另一个问题。”*解决这个问题会更有成效。 –

+1

Aaaaaaaand是什么问题? – looper

+0

@looper当我按住“Z”时,打印“Button_Z被按下”,同时按住“Z”键然后按住“X”,打印另一行“Button_X is pressed”。现在问题是,当我释放“Z”键时,虽然它应该打印“Button_Z被释放”,但它不打印任何东西。尝试编译并运行它以查看我的真正含义。 –

回答

3

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

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 
+0

我真的很感激,你帮我理解了JVM如何执行这段代码。 –