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

Firing an event every 10 miliseconds under a certain condition Javafx

您好,我正在尝试在检测到拖动但鼠标尚未释放的情况下每 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;
    });

不幸的是,之前我曾尝试在活动中使用预定的执行程序服务,但这并没有正常工作。

您可以使用一个 AnimationTimer,它(尝试)以每 second.So 60 帧的速度运行,每次 10 秒后您执行代码(您必须启动 AnimationTimer时间):


代码:

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,因为 final restriction 和 Lambdas)

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());
        }
    });