如何在JavaFX中检测滚动或鼠标事件的来源是触控板还是鼠标?

时间:2015-07-23 14:01:39

标签: javafx mouse trackpad

这与this one基本相同,但使用JavaFX而不是java swing:

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

1 个答案:

答案 0 :(得分:1)

根据ScrollEvent上的documentation,处理来自鼠标和触控板的滚动事件存在细微差别。

  

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

考虑到这一点,您可以跟踪SCROLL_STARTEDSCROLL_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();
});
相关问题