Как сделать так, чтобы JavaFX ScrollPane автоматически прокручивался до самого дна?

У меня есть Scrollpane с достаточно большим содержанием, чтобы активировать вертикальную полосу прокрутки.fx:id из Scrollpane является myScrollPane, у меня тоже есть button называется Scroll To The Bottom, Я установил Action Event из Scroll To The Bottombutton как показано ниже 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);
}
Другие вопросы по тегам