在特定条件下每10毫秒触发一次事件Javafx

在特定条件下每10毫秒触发一次事件Javafx,java,events,javafx,mouseevent,Java,Events,Javafx,Mouseevent,您好,我正在尝试在检测到拖动但未释放鼠标的情况下,每10毫秒触发一次事件。下面是我希望触发的代码 mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { endX = e.getX(); endY = e.getY(); Bounds viewBounds = mapScroll.getViewportBounds(); double startEndX = star

您好,我正在尝试在检测到拖动但未释放鼠标的情况下,每10毫秒触发一次事件。下面是我希望触发的代码

mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {
        endX = e.getX();
        endY = e.getY();
        Bounds viewBounds = mapScroll.getViewportBounds();
        double startEndX = startX - endX;
        double startEndY = startY - endY;

        Bounds contentBounds = mapScroll.getContent().getLayoutBounds();

        double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
        double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
        mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
        mapScroll.setVvalue(mapScroll.getVvalue() + vChange);

        startX = endX;
        startY = endY;
    });
不幸的是,在我尝试在事件中使用计划执行器服务之前,这没有正常工作。

您可以使用(尝试)以每秒60帧的速度运行的。因此,每过10秒,您就执行代码(每次都必须启动
动画计时器
):


代码:

public void startTimer(){

   AnimationTimer timer = new AnimationTimer() {
           int seconds;
        @Override
        public void handle(long now) {

               //every time 10 seconds have passed
               //note that 1 second=1000 milliseconds=1.000.000 nanoseconds
               //now->variable which represents nano seconds
               if(now%10000000 == 0){

                  endX = e.getX();
                  endY = e.getY();
                 Bounds viewBounds = mapScroll.getViewportBounds();
                 double startEndX = startX - endX;
                 double startEndY = startY - endY;

                 Bounds contentBounds = mapScroll.getContent().getLayoutBounds();

                 double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
                 double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
                 mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
                 mapScroll.setVvalue(mapScroll.getVvalue() + vChange);

                 startX = endX;
                 startY = endY;

              }
            }
        }
    }

     timer.start();

}


只需添加一个检查,检查自上次执行以来是否已过10毫秒。(我使用了LongProperty,因为与Lambdas的关系)


你应该提供一些解释(看看Meta)。我不确定这个问题是否有意义。如果鼠标在该脉冲期间被拖动并改变位置,则您已经拥有的事件过滤器将在每个脉冲中执行一次,也就是说,它将以系统能够检测到鼠标位置变化并作出响应的速度执行。每10ms(100Hz)比JavaFX的目标脉冲率(60Hz)稍快一点,因此并不是每次对滚动窗格所做的更改都会被呈现(有时在同一脉冲中会发生两次更改)。你想做什么?@James_D我想他想做的是,当你在windows资源管理器中拖动一个文件或文件夹时,它有许多垂直或水平的文件。滚动条根据鼠标的位置垂直或水平移动(如果鼠标垂直或水平到达窗口的末端)所以你可以看到和其他文件。理论上它应该更新得很快,但实际上它移动得很明显,这不是我想要的。我知道这不是我的电脑,因为这个程序对我使用的处理器或RAM的百分比几乎没有影响。我怀疑这是我的代码的问题,因为
setpannable(true)也存在同样的问题所以是的…复杂的东西使它不能很好地工作。
final LongProperty timeOfLastExecute = new SimpleLongProperty(System.currentTimeMillis());

mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {
        if(System.currentTimeMillis() - timeOfLastExecute.get() > 10) {
            endX = e.getX();
            endY = e.getY();
            Bounds viewBounds = mapScroll.getViewportBounds();
            double startEndX = startX - endX;
            double startEndY = startY - endY;

            Bounds contentBounds = mapScroll.getContent().getLayoutBounds();

            double hChange = startEndX / (contentBounds.getWidth() - viewBounds.getWidth());
            double vChange = startEndY / (contentBounds.getHeight() - viewBounds.getHeight());
            mapScroll.setHvalue(mapScroll.getHvalue() + hChange);
            mapScroll.setVvalue(mapScroll.getVvalue() + vChange);

            startX = endX;
            startY = endY;
            timeOfLastExecute.set(System.currentTimeMillis());
        }
    });