Как определить, является ли источник события прокрутки или мыши трекпадом или мышью в 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_EVENTs может произойти после 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();
});
Другие вопросы по тегам