这与这个问题基本相同,但使用的是 JavaFX 而不是 java swing:
我想知道滚动事件是由触控板还是JavaFX中的鼠标生成的。
根据有关处理来自鼠标和触控板的滚动事件的文档,ScrollEvent
存在细微差别。
当滚动由触摸手势产生时(例如在触摸屏上拖动手指),它被
SCROLL_STARTED
andSCROLL_FINISHED
事件包围。
考虑到这一点,您可以在这两个边界之间跟踪事件并修改您的处理SCROLL_STARTED
程序SCROLL_FINISHED
。SCROLL_EVENT
但是触控板可以在发送SCROLL_EVENT
后发送 s SCROLL_FINISHED
(滚动惯性),因此您可以查看event.isInertia()
过滤这些事件的方法。
由于 JavaFX 中的一个可能的错误,在极少数情况下SCROLL_EVENT
s 可能会在SCROLL_FINISHED
with之后发生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();
});