我有一个自定义fxml视图的列表视图。一切都好。现在我想像幻灯片放映一样自动显示我的所有项目。我尝试在列表视图上使用translatetransition。它做我想要的但问题是当listview包含更多项目并需要滚动时,它只翻译1或2个项目,通常显示为listview而不滚动。 表示我只能翻译listview默认视图区域,但其他需要滚动的项目不会显示。
我的翻译代码如下:
t = new TranslateTransition(Duration.seconds(10), listView);
t.setToY(-(Screen.getPrimary().getVisualBounds().getHeight() + 500));
t.setAutoReverse(true);
t.setCycleCount(TranslateTransition.INDEFINITE);
t.play();
答案 0 :(得分:1)
当然它没有显示所有项目。屏幕上显示的ListCell
没有多少{+可能有一些距离视口足够近。)
通常只显示一个单元格,您可以调用scrollTo
方法。但是,如果要控制滚动速度,则不能选择此选项。
您需要调整可以访问ScrollBar
的滚动位置,并使用Timeline
动画来更改其值:
@Override
public void start(Stage primaryStage) {
ListView<Integer> listView = new ListView<>();
for (int i = 0; i < 100; i++) {
listView.getItems().add(i);
}
Button btn = new Button("start/stop scrolling");
Scene scene = new Scene(new VBox(listView, btn));
// make sure skin is created
listView.applyCss();
listView.layout();
// assuming vertical listview here
ScrollBar scrollBar = (ScrollBar) listView.lookup(".scroll-bar:"+listView.getOrientation().toString().toLowerCase());
DoubleProperty pos = new SimpleDoubleProperty();
DoubleBinding scrollValueBinding
= scrollBar.maxProperty().subtract(scrollBar.minProperty()).multiply(pos).add(scrollBar.minProperty());
Timeline timeline = new Timeline(
new KeyFrame(Duration.ZERO, new KeyValue(pos, 0d)),
new KeyFrame(Duration.seconds(5), new KeyValue(pos, 1d))
);
scrollBar.visibleProperty().addListener((observable, wasVisible, isVisible) -> {
if (!isVisible) {
// stop when scrollbar disappears
timeline.pause();
}
});
timeline.statusProperty().addListener((observable, oldStatus, newStatus) -> {
if (newStatus == Animation.Status.RUNNING) {
scrollBar.setDisable(true);
scrollBar.valueProperty().bind(scrollValueBinding);
} else if (oldStatus == Animation.Status.RUNNING) {
scrollBar.setDisable(false);
scrollBar.valueProperty().unbind();
}
});
timeline.setAutoReverse(true);
timeline.setCycleCount(Animation.INDEFINITE);
btn.setOnAction(evt -> {
if (timeline.getStatus() == Animation.Status.RUNNING || !scrollBar.isVisible()) {
timeline.pause();
} else {
// only run if not already running and scrollbar is visible
Duration total = timeline.getCycleDuration();
timeline.playFrom(total.multiply((scrollBar.getValue() - scrollBar.getMin()) / (scrollBar.getMax() - scrollBar.getMin())));
}
});
primaryStage.setScene(scene);
primaryStage.show();
}