2016-05-24 1 views
1

Java KeyListenerクラスにはダブルキープレスのオプションがありません。したがって、複数の配列とarraylistsを使用して自分自身を作成し​​ようとしました。ここで javaの配列と配列リストを使用するキーリスナーのダブルクリック機能は、すべてダブルクリックとしてカウントされます。

私は括弧のいくつかは奇妙な場所にある場合はごめんなさいreleventコード

private ArrayList<Integer> ButtonsPressedChar = new ArrayList<Integer>(); 
    private ArrayList<Long> ButtonsPressedTimes = new ArrayList<Long>(); 
    private int[] PossiblePresses = new int[222]; 
    private ArrayList<Integer> DoublePresses = new ArrayList<Integer>(); 
    private ArrayList<Integer> ToBeRemovedChars = new ArrayList<Integer>(); 
    private ArrayList<Integer> ToBeRemovedTimes = new ArrayList<Integer>();  
    private Long LastTimeForDoublePress; 
    private Long NowTime; 
    private int PositionTime; 
    private int PositionChar; 

    public void DetectDoubleKeyPresses(){ 
     PositionTime = 0; 
     PositionChar = 0; 
     NowTime = System.currentTimeMillis(); 
     for(int temp : PossiblePresses){ 
      PossiblePresses[temp] = 0;      
     } 
     for(Long temp: ButtonsPressedTimes){ 
      if(temp - NowTime >= 300){ 
       ButtonsPressedChar.remove(PositionTime); 
       ToBeRemovedTimes.add(PositionTime); 
       System.out.println("removed");       
      } 
      PositionTime++; 
     } 
     for(int temp: ToBeRemovedTimes){ 
      ButtonsPressedTimes.remove(temp); 
      System.out.println("DONE"); 
     } 
     DoublePresses.clear(); 
     for(Integer temp: ButtonsPressedChar){ 
      System.out.println("hi 1"); 
      if(PossiblePresses[temp] == 0){ 
       System.out.println("First Press" + temp + PossiblePresses[temp]); 
       PossiblePresses[temp] = 2; 
      } 
      else if(PossiblePresses[temp] == 2){ 
       DoublePresses.add(temp); 
       System.out.println(ButtonsPressedChar.size()); 
       ToBeRemovedChars.add(temp); 
       ButtonsPressedTimes.remove(PositionChar); 
       System.out.println("DOUBLE PRESS" + temp.toString()+ PossiblePresses[temp]); 
      } 
      System.out.println("hi 2"); 
      PositionChar++; 
     } 
     for(Integer temp: ToBeRemovedChars){ 
      while(ButtonsPressedChar.contains(temp)){ 
       ButtonsPressedChar.remove(temp); 
      } 
      System.out.println("DONE"); 
     } 
     ToBeRemovedChars.clear(); 
     LastTimeForDoublePress =NowTime; 
    } 

public class Keys implements KeyListener{ 
    @Override 
    public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 
     if(ButtonsHeld.contains(e.getKeyCode())){ 
      Integer tempInteger = new Integer(e.getKeyCode()); 
      ButtonsHeld.remove(tempInteger); 
     } 
     else 
      System.out.println("ERROR");    
     System.out.println(e.getKeyCode()); 
     ButtonsPressedChar.add(e.getKeyCode()); 
     ButtonsPressedTimes.add(System.currentTimeMillis())    
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(ButtonsHeld.contains(e.getKeyCode())){    
      System.out.println("Error: Attempted Key Press Twice, original press was not removed from ButtonsHeld"); 
     }  
     else if(!ButtonsHeld.contains(e.getKeyCode())){ 
      ButtonsHeld.add(e.getKeyCode()); 
     } 
    }  

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public ArrayList<Integer> ButtonsHeld = new ArrayList<Integer>();   
    public void KeyHeldChecker(){    
     }   
} 

ですが、私はコードブロック

二重鍵を検出してそれを得るためにすべてを調整しなければなりませんでしたプレスは1秒間に60回実行されます。 'hi 1'と 'hi 2'は、何が実行されているかを見るためのデバッグの一部に過ぎませんでした。これは、J(キーコード74)が一回押されたときに実行されているものです:最初は

 
74 
hi 1 
First press740 
hi 2 
hi 1 
1 
DOUBLE PRESS742 
hi 2 
DONE

を私は可能なプレスが適切に消去されていないと思ったが、ループのために働いているようです。なぜ誰かがこれがうまくいかないこと、あるいはこれを行うためのよりよい方法を知っていれば、それはすばらしいことになります。

申し訳ありませんが、私は正直なところ、それを動作させることができず、四つのスペースを見つけられません。私はそれが見たり、理解することをあまりにも困難にしないことを願っています。

答えて

0

単純なダブルプレスを検出したい場合は、配列やArraylistsの必要はありません。以前のキーを実際に保存するだけです。

はこのことを考えてみません:あなたはKその後、Jを押すと、あなたがそれを気にしない理由、その後J Jはそう、もはやダブルプレスです。

public class DoubleKeyPressDetection 
{ 
    // Below int is the number of milliseconds between the presses to determine 
    // if it was an intentional double press 
    // Adjust this for sensitivity required 
    private static int doublePressSpeed = 500; // Half a second 
    private static KeyEvent lastKeyEvent; 

    public static boolean isDoublePress(KeyEvent ke) 
    { 
     KeyEvent temp = lastKeyEvent; 
     lastKeyEvent = ke; 
     return temp != null 
      && temp.getKeyCode() == ke.getKeyCode() 
      && ((ke.getWhen() - temp.getWhen()) < doublePressSpeed); 
    } 
} 

次に、あなたのKeyListener

@Override 
public void keyPressed(KeyEvent e) 
{ 
    if(DoubleKeyPressDetection.isDoublePress(e)) 
     System.out.println("You have double pressed " + KeyEvent.getKeyText(e.getKeyCode())); 
} 

ポイントに注意することは:あなたは、次を使用することができ、この行うには

  • をあなたはkeyPressed両方でこれを置く場合をし、 keyReleasedメソッドを呼び出すと、すべてのkeyPressとreleaseでアクションが実行されるため、正しく動作しません
  • あなたがkeyTypedメソッドを使用する場合KeyEvent
  • ないすべてのキーが
(スイングアプリで タブすなわち、あなたのアプリケーションに応じて)これで追跡されるキーコードを持っていないとして、これは動作しない場合があります
+0

申し訳ありませんJava悪魔、私はより具体的だったはずです。私がこれを必要とするのは、2人のプレイヤーが2人のゲームでダブルプレスを検出することです。キーボードを使用している2人が互いに干渉したり、複数のボタンを押すことに干渉することさえあります。 P.S.二重プレスはダッシュ機能のためのものです –

+0

Java悪魔は、他のプレイヤーが二重押している間にダブルプレイプログラムを妨害することができませんでした。あなたがそれをする方法を知っていれば、それは素晴らしいだろうが、なぜそれがうまくいかないのか分かっていれば、それはもっと良くなるだろう。 –

+0

@SamChapmanはい、私は彼らがお互いのプレスを妨げる可能性があることを見ている。これが当てはまる場合、私は各プレイヤーがキーを設定しているだけなので、私の例を静的にせずに、各プレイヤーの検出クラスのインスタンスを持ち、聴取者は、そのプレイヤーの検出インスタンス。申し訳ありませんが、あなたのために何かを草案する時間がありません。 –

関連する問題