2016-05-24 56 views
1

java KeyListener類沒有用於雙擊按鍵的選項,所以我嘗試使用多個數組和列表列表來創建自己的數組。在java中使用數組和列表的雙擊函數用於計算所有事件爲雙擊

這裏是培訓相關代碼

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(){    
     }   
} 

我很抱歉,如果一些支架是怪異的地方,我不得不調整一切來得到它的代碼塊

檢測雙核心印刷機每秒執行60次。 'hi 1'和'hi 2'只是我調試的一部分,用於查看正在執行的內容。這是當J(鑰匙代碼74),按下一個什麼時間執行:

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

起初我還以爲可能印刷機沒有被正確地清除,但for循環似乎工作。如果有人知道爲什麼這不起作用,或者甚至只是一個更好的方式,這將是驚人的。

對不起,格式不好,我真的不能得到它的工作,並沒有找到任何他們不應該四處空間。我希望這不會讓人難以理解。

回答

0

如果你想檢測到一個簡單的雙按壓,沒有任何陣列或Arraylists真正的需要。您只需確實存儲以前的按鍵。

考慮一下:如果按Ĵ然後ķ然後Ĵ殲不再是一個雙壓機那麼爲什麼你關心。

要做到這一點,你可以使用以下命令:

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())); 
} 

注意要點:

  • 如果你把這個在兩個keyPressedkeyReleased方法,然後它會對每個keyPress和釋放操作 - 所以無法正常工作
  • 如果使用keyTyped方法那麼這可能還不如KeyEvent工作沒有鍵代碼
  • 並非所有的按鍵將由此被跟蹤(取決於您的應用程序即標籤在Swing應用程序)
+0

對不起Java魔鬼,我應該更具體。我需要的原因是在雙人遊戲中檢測到雙擊,兩個人使用鍵盤可能會互相干擾,或者有人甚至可能會按下多個按鈕來干擾自己。附:雙擊是用於破折號功能 –

+0

Java惡魔不能讓一個玩家雙擊,而另一個玩家雙擊則干擾雙擊程序。如果你知道如何做到這一點,那將是非常棒的,但如果你知道爲什麼它不工作,那會更好。 –

+0

@SamChapman是的,我知道,他們可能會干擾每個人的新聞。好吧,如果是這種情況,那麼我假設每個玩家只設置了密鑰,這樣你就可以讓我的例子不是靜態的,然後爲每個玩家設置一個探測類的實例,並在你的聆聽者中確定按鍵的作用和參考即玩家檢測實例。對不起,我現在沒有時間爲你起草一些東西。 –