2011-03-04 69 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