2017-01-18 17 views
1

У меня есть Scrollpane с достаточно большим содержанием для активной вертикальной полосы прокрутки. fx:idScrollpane является myScrollPane. У меня также есть button под названием Scroll To The Bottom. Я установил Action EventScroll To The Bottombutton, как показано ниже, в контроллере fxml.Как сделать прокрутку JavaFX ScrollPane медленно вниз?

@FXML 
private voide myButtonOnAction(ActionEvent evt) { 
    myScrollPane.setVvalue(1.0); 
} 

Это, однако, прокручивается на дно очень fast.It не может быть сказано, был ли он прокручивается либо. Я хочу знать способ сделать Scrollpane прокрутки МЕДЛЕННО.

ответ

6

Не используйте таймер для этого, если вы не подготовлены чтобы каждое обновление обновлялось до значения полосы прокрутки при вызове Platform.runLater.

Правильный подход заключается в использовании Timeline анимации:

static void slowScrollToBottom(ScrollPane scrollPane) { 
    Animation animation = new Timeline(
     new KeyFrame(Duration.seconds(2), 
      new KeyValue(scrollPane.vvalueProperty(), 1))); 
    animation.play(); 
} 
+1

Что такое «new KeyValue()» –

+1

Ключевым значением является фактическое изменение, которое должно произойти в анимации. Как вы можете видеть, это изменяет значение vvalue 'scrollPane' на 1. Каждый KeyValue связан с определенным KeyFrame, который, как вы можете видеть в коде, заставит KeyValue вступить в силу через 2 секунды. – VGR

+0

замечательно работает! Можете ли вы рассказать мне место для изучения анимации javaFX? –

2

Чтобы быстро я буду использовать таймер и постепенно увеличивать VVALUE к 1. Вы можете обратиться к this нити, чтобы увидеть, как использовать таймер в Java

+0

Спасибо, это полезно знать! –

+2

Внимание: это не будет использовать правильную нить, если ваш таймер не использует 'Platform.runLater'. – VGR

+0

Я следил за вашим мнением, и вот мой код в нижеследующих ответах раздела –

-1
@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); 
} 
+0

Это нарушает правила потоковой передачи JavaFX. Вы не можете вызывать 'myScrollPane.setVvalue (...)' из фонового потока. –

+0

@James_D истинно! Каким будет правильный способ сделать это в таких требованиях? Я действительно не знаю правил потоковой передачи JavaFX. Не могли бы вы разместить ссылку здесь, чтобы посмотреть? –

+0

Тот, у кого анимация Timeline - лучший ответ :) Подход на шахте был взломан для начала. –