1

这与这个问题基本相同,但使用的是 JavaFX 而不是 java swing:

我想知道滚动事件是由触控板还是JavaFX中的鼠标生成的。

4

1 回答 1

1

根据有关处理来自鼠标和触控板的滚动事件的文档ScrollEvent存在细微差别。

当滚动由触摸手势产生时(例如在触摸屏上拖动手指),它被SCROLL_STARTEDandSCROLL_FINISHED事件包围。

考虑到这一点,您可以在这两个边界之间跟踪事件并修改您的处理SCROLL_STARTED程序SCROLL_FINISHEDSCROLL_EVENT但是触控板可以在发送SCROLL_EVENT后发送 s SCROLL_FINISHED(滚动惯性),因此您可以查看event.isInertia()过滤这些事件的方法。

由于 JavaFX 中的一个可能的错误,在极少数情况下SCROLL_EVENTs 可能会在SCROLL_FINISHEDwith之后发生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();
});
于 2015-11-02T16:03:12.127 回答