JavaFX滚动开始和结束

JavaFX滚动开始和结束,java,javafx,scrollpane,Java,Javafx,Scrollpane,我有一个非常昂贵的行动要做的鼠标滚动窗格。我目前使用 pane.setOnScroll({myMethod()}). 问题是,如果你滚动很多次,它会多次计算所有内容。因此,我想要的是只在卷轴完成时执行操作。我希望使用setOnScrollStarted、保存起始值和setonscrollfished来执行我的操作 但我不知道为什么这两个方法从未被调用。作为一个测试,我用 pane.setOnScroll({System.out.println("proof of action"}); 很明显

我有一个非常昂贵的行动要做的鼠标滚动窗格。我目前使用

pane.setOnScroll({myMethod()}).
问题是,如果你滚动很多次,它会多次计算所有内容。因此,我想要的是只在卷轴完成时执行操作。我希望使用
setOnScrollStarted
、保存起始值和
setonscrollfished
来执行我的操作

但我不知道为什么这两个方法从未被调用。作为一个测试,我用

pane.setOnScroll({System.out.println("proof of action"});
很明显,它从未被叫来过

你知道如何只在卷轴的末尾调用我的方法吗

提前感谢(我的重点):

通过触摸手势(如拖动鼠标)产生滚动时 手指放在触摸屏上),它被滚动条环绕 并滚动完成的事件。更改涉及的接触点数量 在滚动过程中被认为是一种新的手势,因此 SCROLL\u FINISHED(滚动完成)和SCROLL\u STARTED(滚动开始)通知将在每个 触摸计数更改的时间当鼠标导致滚动时 控制盘旋转时,仅传递一次滚动事件,不包含 开始/结束环境。

可能的解决方法:

每次检测到滚动时递增一个计数器变量。在侦听器中,启动一个新线程,该线程等待1秒,仅当计数器等于1(最后一次滚动)时才执行所需的操作,然后递减计数器

我创建了一个,但我在这里复制了代码:

public class ScrollablePane extends Pane {
    private Integer scrollCounter = 0;

    private final ObjectProperty<EventHandler<? super ScrollEvent>> onScrollEnded = new SimpleObjectProperty<>();

    public final ObjectProperty<EventHandler<? super ScrollEvent>> onScrollEndedProperty() {
        return onScrollEnded;
    }

    public ScrollablePane() {
        this.setOnScroll(e -> {
            scrollCounter++;

            Thread th = new Thread(() -> {
                try {
                    Thread.sleep(1000);
                    if (scrollCounter == 1)
                        onScrollEnded.get().handle(e);

                    scrollCounter--;
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            });
            th.setDaemon(true);
            th.start();
        });
    }

    public void setOnScrollEnded(EventHandler<? super ScrollEvent> handler) {
        onScrollEnded.setValue(handler);
    }
}

您的第三段中的代码示例无法编译,您缺少一个右括号。滚动开始和滚动结束不会触发,因为它们仅在滚动通过触摸手势执行时才会触发(而不是使用鼠标滚轮)。
public class MyApplication extends Application {


    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);

            ScrollablePane pane = new ScrollablePane();
            pane.setOnScrollEnded(e -> System.out.println("Scroll just has been ended"));

            root.setCenter(pane);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}