Java KeyListener keyPressed метод срабатывает слишком быстро - PullRequest
2 голосов
/ 05 марта 2011

Если вы используете класс java KeyListener, вы знаете, что, удерживая клавишу *, 1002 * сработает один KeyEvent, а затем, примерно через полсекунды, сработает один и тот же ключ много раз, очень и очень быстро.Я хотел бы знать, есть ли способ удержать KeyEvents от слишком быстрой стрельбы.Я бы хотел, чтобы они работали с постоянной постоянной частотой примерно каждые 500 мс.

Ответы [ 4 ]

5 голосов
/ 05 марта 2011

Можно, но хитрость заключается не в том, чтобы замедлять запуск событий, а в том, чтобы замедлять их обработку:

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

};
4 голосов
/ 05 марта 2011

Нет, это полностью зависит от системы. Вам нужно будет прослушивать 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 голосов
/ 05 марта 2011

Это контролируется вашей ОС. Но ваш обработчик может легко проверить, сколько времени прошло с момента его последнего запуска, и ответить соответствующим образом.

1 голос
/ 05 марта 2011

Обычно частота автоматического повторения для клавиш устанавливается системой; Я не знаю, может ли это быть изменено изнутри Java. Однако вы можете использовать время прибытия события, чтобы не реагировать на него, до 500 мс после того, как вы в последний раз отреагировали (или после отпускания ключа, что должно сбрасывать таймер для пользователей, которые печатают быстро).

...