2017-01-18 362 views
1

我有一個Scrollpane與足夠大的內容來激活垂直滾動條。 fx:idScrollpanemyScrollPane。 我也有一個buttonScroll To The Bottom。 我已經在fxml控制器中設置了Scroll To The BottombuttonAction Event,如下所示。如何讓JavaFX ScrollPane自動滾動到底部?

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

但是,它會非常快速地滾動到底部,它不能被告知是否被滾動。我想知道如何讓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

什麼是「新的KeyValue()」 –

+1

關鍵值是應在動畫中發生的實際更改。如您所見,它將scrollPane的「vvalue」更改爲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 true!根據這些要求,什麼纔是正確的方法呢?我並不真正瞭解JavaFX的線程規則。你可以在這裏發表一篇參考文獻來看看嗎? –

+0

帶時間軸動畫的人是最好的答案:)我的方法是一個開始。 –