Как сделать так, чтобы JavaFX ScrollPane автоматически прокручивался до самого дна?
У меня есть Scrollpane
с достаточно большим содержанием, чтобы активировать вертикальную полосу прокрутки.fx:id
из Scrollpane
является myScrollPane
, у меня тоже есть button
называется Scroll To The Bottom
, Я установил Action Event
из Scroll To The Bottom
button
как показано ниже fxml
контроллер.
@FXML
private voide myButtonOnAction(ActionEvent evt) {
myScrollPane.setVvalue(1.0);
}
Это, однако, очень быстро прокручивается до самого дна. Нельзя сказать, была ли она прокручена. Я хочу знать, как сделать Scrollpane
свитки МЕДЛЕННО.
3 ответа
Не используйте таймер для этого, если только вы не готовы обернуть каждое обновление значением полосы прокрутки в вызове Platform.runLater.
Правильный подход - использовать анимацию на временной шкале:
static void slowScrollToBottom(ScrollPane scrollPane) {
Animation animation = new Timeline(
new KeyFrame(Duration.seconds(2),
new KeyValue(scrollPane.vvalueProperty(), 1)));
animation.play();
}
Чтобы быть быстрым, я буду использовать Timer и постепенно увеличивать vValue до 1. Вы можете обратиться к этой теме, чтобы узнать, как использовать Timer в Java.
@FXML
private void myButtonOnAction(ActionEvent evt) {
double vVal = myScrollPane.getVvalue();
double d = (1.0-vVal)/100;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
boolean isTheStart = true;
double difference;
@Override
public void run() {
double currentVVal = myScrollPane.getVvalue();
if (isTheStart) {
isTheStart = false;
difference = (1.0 - currentVVal)/100;
}
myScrollPane.setVvalue(currentVVal+difference);
if (currentVVal >= 1.0) {
this.cancel();
}
}
}, 1*500, 10);
}