2011-03-04 68 views
2

如果您使用java KeyListener類,那麼您知道如果按住一個鍵keyPressed將觸發一個KeyEvent,然後大約半秒鐘後將非常快速地觸發相同的鍵多次。我想知道是否有辦法避免KeyEvent發射太快。我希望他們能以每500毫秒一次的不錯的恆定速率。Java KeyListener keyPressed方法觸發得太快

回答

1

通常,按鍵的自動重複率由系統設置;我不知道它是否可以從Java內部更改。但是,您可以使用事件到達時間,直到您最後一次反應後500毫秒內(或者在密鑰釋放之後,應該爲鍵入快速的用戶清除計時器)之後的500毫秒內不對其作出響應。

5

可以,但關鍵是要不會減慢事件的觸發,但是放緩的速度有多快,你處理它們:

KeyListener kl = new KeyListener() { 
    private long lastPressProcessed = 0; 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(System.currentTimeMillis() - lastPressProcessed > 500) { 
      //Do your work here... 
      lastPressProcessed = System.currentTimeMillis(); 
     }   
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

    @Override 
    public void keyReleased(KeyEvent e) { } 

}; 
+0

這隻有在系統密鑰重複非常快時纔會有效。如果按下時間爲400毫秒,則可能會導致延遲達900毫秒。 – aioobe 2011-03-04 21:48:03

+0

@aioobe - 除了改變系統自動重複速率之外,我認爲沒有辦法。這是一個欠採樣的屬性;會出現鋸齒現象,這會顯示爲緊張的重複時間。如果您正在處理長時間的自動重複事件,那麼可以應用反鋸齒技術來減少抖動,但是我懷疑長時間的自動重複事件是常見的應用。 – 2011-03-06 00:19:17

4

不,這完全取決於系統。您必須聽取keyPressed事件,自行啓動一個定時器,以固定速率觸發事件,並在下一個keyReleased事件中停止。

嘗試這樣:

component.addKeyListener(new KeyListener() { 

    Timer t = new Timer(); 
    TimerTask tt; 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     tt.cancel(); 
     tt = null; 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (tt != null) 
      return; 

     tt = new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println(System.currentTimeMillis() % 1000); 
      } 
     }; 

     t.scheduleAtFixedRate(tt, 0, 500); 
    } 
}); 
1

這是由你的操作系統控制。但你可以很容易地讓你的處理程序檢查自上次被觸發和響應以來的時間。

+0

查看Kurt Kaylor針對編碼解決方案的答案。 – 2011-03-04 21:47:53