Как определить, является ли источник события прокрутки или мыши трекпадом или мышью в JavaFX?
Это в основном тот же вопрос, что и этот, но с JavaFX вместо java swing:
Я хочу знать, генерируется ли событие прокрутки трекпадом или мышью в JavaFX.
1 ответ
Согласно документации на ScrollEvent
есть небольшая разница в обработке событий прокрутки от мыши и трекпада.
Когда прокрутка производится жестом касания (например, перетаскивание пальца по сенсорному экрану), она окружается
SCROLL_STARTED
а такжеSCROLL_FINISHED
События.
Имея это в виду, вы можете отслеживать SCROLL_STARTED
а также SCROLL_FINISHED
события и изменить ваши SCROLL_EVENT
Обработчик между этими двумя границами. Однако трекпад может отправлять SCROLL_EVENT
с после SCROLL_FINISHED
(инерция прокрутки), чтобы вы могли проверить event.isInertia()
метод фильтрации этих событий.
Из-за возможной ошибки в JavaFX в редких случаях SCROLL_EVENT
s может произойти после SCROLL_FINISHED
с event.isInertia() == false
(если вы прокручиваете трекпад очень быстро много раз). Возможный обходной путь - отслеживать метку времени последнего события SCROLL_FINISHED и игнорировать эти "побочные" события в течение короткого периода времени после этой метки времени.
Пример кода:
long lastFinishedScrollingTime;
boolean trackpadScrolling;
node.setOnScroll(event -> {
long timeDiff = System.currentTimeMillis() - lastFinishedScrollingTime;
boolean ghostEvent = timeDiff < 1000; // I saw 500-700ms ghost events
if (trackpadScrolling || event.isInertia() || ghostEvent) {
// trackpad scrolling
} else {
// mouse scrolling
}
});
node.setOnScrollStarted(event -> {
trackpadScrolling = true;
});
node.setOnScrollFinished(event -> {
trackpadScrolling = false;
lastFinishedScrollingTime = System.currentTimeMillis();
});