这与this one基本相同,但使用JavaFX而不是java swing:
我想知道在JavaFX中是否由触控板或鼠标生成滚动事件。
答案 0 :(得分:1)
根据ScrollEvent
上的documentation,处理来自鼠标和触控板的滚动事件存在细微差别。
当通过触摸手势(例如在触摸屏上拖动手指)产生滚动时,它会被
SCROLL_STARTED
和SCROLL_FINISHED
事件包围。
考虑到这一点,您可以跟踪SCROLL_STARTED
和SCROLL_FINISHED
个事件,并在这两个边界之间修改SCROLL_EVENT
处理程序。但是,触控板可以在发送SCROLL_EVENT
之后发送SCROLL_FINISHED
(滚动惯性),以便您可以查看event.isInertia()
方法来过滤这些事件。
由于JavaFX中可能存在错误,在极少数情况下SCROLL_EVENT
可能会在SCROLL_FINISHED
event.isInertia() == false
之后发生(如果您在触控板上滚动非常快很多次)。可能的解决方法是跟踪最后一个SCROLL_FINISHED事件的时间戳,并忽略这些" ghost"在该时间戳之后的短时间内发生的事件。
示例代码:
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();
});