java-在ListView中侦听ScrollBar的更改

我正在尝试收听列表视图的滚动条更改.我的第一个尝试就是这样做

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

但是,这似乎不起作用.我尝试使用调试器,发现EventHandler hash中的handle方法没有被调用.

我搜索了其他解决方案,发现此解决方案(https://gist.github.com/jewelsea/1684622)有效,但是,如果我将每个循环的移动到primaryStage.show()之前的位置,则该解决方案将不起作用.因此,对于我的用例而言,这不是一个理想的解决方案,因为我已将UI代码拆分为许多子组件,并且需要在调用primaryStage.show()之前设置侦听器(我不会公开listview实例)到主应用程序类).

我认为问题在于,仅当节点已经显示在舞台上时,lookUpAll方法才起作用.我想过一些解决方法,例如以一种方法执行foreach循环,该方法将在节点完全附加到场景图并显示在屏幕上后执行,但是我仍然不知道该如何实现这个.

谢谢.

解决方法:

假定您将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;
            }
        }});
上一篇:使用Scene Builder创建JavaFX TreeView


下一篇:JavaFX节点的焦点侦听器