события с клавиатуры будут происходить независимо от вашего кода в слушателях, пользователь нажимает клавишу, и событие запускается ОС, а затем дело доходит до Java. Теперь вам решать, хотите ли вы слушать это событие или нет. Обработка событий в Java выполняется слушателями. Когда вы вызываете addXXXListener, - слушатель «зарегистрировался» в Java, и он будет уведомлен о событиях, вы вызываете removeXXXListener - и слушатель будет «отменен». Вот как это работает. В коде слушателя вы решаете, что делать с событиями, полученными из Java.
Сказав это, ответ на ваш вопрос в целом таков: вы можете игнорировать события в вашем слушателе, когда вам нужно (когда вы получили «предыдущее нажатие клавиши»). Другой подход - вызывать removeListener / addListener, когда это необходимо.
Еще одна вещь, Swing является однопоточной, поэтому невозможно, чтобы два события происходили «одновременно», поэтому «следующее ключевое событие» будет запущено только после «предыдущее событие complete "... Конечно, вы можете написать свой код внутри слушателя, чтобы он сам порождал потоки, но это совсем другая история.
Надеюсь, это поможет