2013-01-15 5 views
1

키 수신기를 사용하는 작은 응용 프로그램을 프로그래밍하고 있습니다. 특정 키를 누를 때 타이머가 시작되고 해당 키가 해제되면 타이머가 중지됩니다.키를 동시에 누를 때 키를 놓을 때 KeyListener가 트리거되지 않습니다

이제는 한 키를 누를 때만 완벽하게 작동합니다. 3 개의 키를 동시에 누르면 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"키를 누른 상태에서 "X"를 누르고있는 동안 "Z"를 누르고 있으면 "Button_Z is pressed"가 인쇄되고 "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이이 코드를 어떻게 실행하는지 이해하게 도와 주셔서 감사합니다. –

관련 문제