2

如果你使用 javaKeyListener类,你知道如果你按住一个键keyPressed会触发一个KeyEvent,然后大约半秒后会以非常非常快的速度多次触发同一个键。我想知道是否有办法防止KeyEvents开火过快。我希望它们以大约每 500 毫秒一次的恒定速率保持不变。

4

4 回答 4

6

你可以,但诀窍不是减慢事件的触发,而是减慢处理它们的速度:

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

};
于 2011-03-04T21:45:46.170 回答
3

不,这完全取决于系统。您必须侦听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);
    }
});
于 2011-03-04T21:45:50.703 回答
2

这由您的操作系统控制。但是您可以轻松地让您的处理程序检查自上次触发以来的时间并做出相应的响应。

于 2011-03-04T21:46:34.970 回答
1

通常按键的自动重复率由系统设置;我不知道它是否可以从 Java 中更改。但是,您可以使用事件到达时间在您最后一次做出反应后 500 毫秒(或在按键释放后,这应该为快速键入的用户清除计时器)后才对一个事件做出反应。

于 2011-03-04T21:44:44.660 回答