быстрые скорости нажатия клавиш в моем приложении Java Swing, как я могу отбросить события в начале конвейера? - PullRequest
2 голосов
/ 27 января 2010

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

public void actionPerformed(ActionEvent e) {
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}

К сожалению, несмотря на удаление событий, приложение все еще блокируется и создает тонны событий в очереди. Есть ли способ, которым я могу отбросить события на более низком уровне? Я думаю, что к тому времени, когда они дойдут до моего слушателя действий, уже слишком поздно, чтобы спасти приложение от блокировки. Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: я должен также упомянуть, что слушатель является частью AbstractAction, который связан с элементом меню.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Если ваше приложение не может вовремя отреагировать на нажатия клавиш, я бы выделил раздел времени, занятый временем, и обработал его в отдельном потоке.

Затем вы можете создать очередь нажатий клавиш, дубликатов бина и т. Д., Если это необходимо, или выполнить другую интеллектуальную фильтрацию. Все это относится к конкретному приложению, но, по-видимому, суть в том, что при обработке событий в графическом интерфейсе пользователя выполняется интенсивная обработка.

2 голосов
/ 27 января 2010

Я не уверен, поможет ли это на самом деле, но, возможно, вам следует сделать это так:

public void actionPerformed(ActionEvent e) {
    e.consume();
    long now = System.currentTimeMillis();
    if(now - lastCall < 150) {
        System.out.println("dropping event");
    }
    else {
        lastCall = now;
    }
}

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/InputEvent.html#consume()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...