1

キーリスナーを使用する小さなアプリケーションをプログラミングしています。特定のキーが押されるとタイマーが開始され、そのキーが離されるとタイマーが停止します。

現在、これは一度に 1 つのキーが押されている場合にのみ完全に機能します。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. 
  } 
  }
4

1 に答える 1

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
于 2013-01-15T13:45:39.610 に答える