2016-11-26 41 views
-1

我有自定義fxml視圖的列表視圖。一切安好。現在我想像幻燈片一樣自動顯示所有項目。我嘗試在列表視圖上使用translatetransition。它做我想要的,但問題是,當listview包含更多的項目,需要滾動,然後它只翻譯1或2項,通常顯示爲列表視圖而不滾動。 這意味着我只能夠翻譯列表視圖默認視圖區域,但其他項目隱藏需要滾動不會顯示。如何在javafx中滑動(translatetransition)listview

我translationtransition代碼如下:

t = new TranslateTransition(Duration.seconds(10), listView); 
    t.setToY(-(Screen.getPrimary().getVisualBounds().getHeight() + 500)); 
    t.setAutoReverse(true); 
    t.setCycleCount(TranslateTransition.INDEFINITE); 
    t.play(); 

回答

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

**我在這行越來越空指針**「DoubleBinding scrollValueBinding = scrollBar.maxProperty()。subtract(scrollBar.minProperty())。multiply(pos).add(scrollBar.minProperty());' – Rhidoy