Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java KeyListener keyPressed方法激发得太快_Java_Swing_Keylistener_Keyevent - Fatal编程技术网

Java KeyListener keyPressed方法激发得太快

Java KeyListener keyPressed方法激发得太快,java,swing,keylistener,keyevent,Java,Swing,Keylistener,Keyevent,如果使用javaKeyListener类,您就会知道,如果按住一个键keyPressed,将触发一个KeyEvent,然后大约半秒钟后,将以非常快的速度多次触发同一个键。我想知道是否有办法防止KeyEvents触发过快。我希望它们保持一个很好的恒定速率,大约每500毫秒一次。通常按键的自动重复速率由系统设置;我不知道它是否可以从Java内部更改。但是,您可以使用事件到达时间对事件不作出反应,直到您最后一次作出反应后500毫秒(或按键释放后,这将清除快速键入的用户的计时器)。您可以这样做,但诀窍是

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

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

您可以这样做,但诀窍是不要减慢事件的触发,而是减慢处理事件的速度:

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

};

不,这完全取决于系统。您必须监听
按键
事件,启动一个以固定速率触发事件的计时器,并在下一个
按键释放
事件时停止

试着这样做:

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

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

只有在系统键重复非常快的情况下,这项功能才能正常工作。如果两次按压之间的间隔是400毫秒,那么这可能会导致高达900毫秒的延迟。@aioobe-我认为,除了改变系统自动回复速率之外,没有其他方法可以解决这个问题。这是欠采样的一个性质;将出现别名,这将显示为一个抖动的重复时间。如果您正在处理长流的自动重放事件,那么可以应用抗锯齿技术来减少抖动,但我怀疑长流的自动重放事件是否是常见的应用程序。