Java KeyListener keyPressed方法触发太快

时间:2011-03-04 21:40:17

标签: java swing keylistener keyevent

如果您使用java KeyListener课程,您知道如果您按住某个键keyPressed将触发一个KeyEvent,然后大约半秒钟将触发相同的密钥时间非常快。我想知道是否有办法让KeyEvents禁止射击太快。我希望它们以每500毫秒一次的恒定速率保持不变。

4 个答案:

答案 0 :(得分: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) {   }

};

答案 1 :(得分: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);
    }
});

答案 2 :(得分:2)

这是由您的操作系统控制的。但是你可以很容易地让你的处理程序检查它自上次触发后的时间长度并做出相应的响应。

答案 3 :(得分:1)

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