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