2013-06-05 108 views
3

我試圖聽清單視圖的滾動條更改。我的第一次嘗試是這樣做的收聽ListView中的滾動條更改

listView.setOnScroll(new EventHandler<ScrollEvent>() 
{ // Code ommited } 

但是,它似乎並不是工作。我嘗試使用調試器,發現EventHandler中的句柄方法已被調用。

我已經搜索了其他解決方案,發現這是一個(https://gist.github.com/jewelsea/1684622)這是工作,但它不起作用,如果我將每個循環移動到primaryStage.show()之前的位置。所以這一個不是我的用例的理想解決方案,因爲我已經將我的UI代碼分割成多個子組件,並且我需要在調用primaryStage.show()之前設置監聽器(我不會公開listview實例到主應用程序類)。

我認爲這個問題是因爲lookUpAll方法只有在節點已經顯示在舞臺上時才起作用。我想到了一些解決方法,例如在節點完全附加到場景圖形並顯示在屏幕上後執行的方法中執行foreach循環,但我仍然不知道如何實現這個。

謝謝。

+0

不是一個無關緊要的但相關的。 [this](http://stackoverflow.com/a/16921731/682495)方法可以幫助你嗎?或者在主應用程序類中,獲取listview fxml的控制器並在stage.show()之後調用controller.initCompnents()。 –

回答

3

假設您將Stage傳遞給創建ListView的方法,您可以使用onShown事件來執行將偵聽器附加到滾動條的代碼。基本上使用一個監聽器來設置你的其他監聽器。例如:

ObservableList<String> names = FXCollections.observableArrayList("1","2","3","4","5","6","7"); 
    final ListView<String> listView = new ListView<String>(names); 

    stage.setOnShown(new EventHandler<WindowEvent>(){ 
     boolean hasRun = false; 
     @Override 
     public void handle(WindowEvent arg0) { 
      if(!hasRun){ 
       for (Node node: listView.lookupAll(".scroll-bar")) { 
        if (node instanceof ScrollBar) { 
         final ScrollBar bar = (ScrollBar) node; 
         bar.valueProperty().addListener(new ChangeListener<Number>() { 
          @Override public void changed(ObservableValue<? extends Number> value, Number oldValue, Number newValue) { 
           System.out.println(bar.getOrientation() + " " + newValue); 
          } 
         }); 
        } 
       } 
       hasRun = true; 
      } 
     }}); 
+0

又一個答案[here](http://stackoverflow.com/questions/26537548/javafx-listview-with-touch-events-for-scrolling-up-and-down/39304755#39304755)。 – Amin