3

我正在尝试收听列表视图的滚动条变化。我的第一次尝试是这样做

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

但是,它似乎不起作用。我尝试使用调试器,发现 EventHandler 哈希中的句柄方法没有被调用。

我已经搜索了其他解决方案并找到了这个(https://gist.github.com/jewelsea/1684622),这是可行的,但是如果我将for each循环移动到primaryStage.show之前的位置,它就不起作用( )。所以这不是我用例的理想解决方案,因为我已经将我的 UI 代码拆分为许多子组件,并且我需要在调用 primaryStage.show() 之前设置侦听器(我不会公开 listview 实例到主应用程序类)。

我认为问题在于,lookUpAll 方法仅在节点已显示在舞台上时才有效。我想到了一些解决方法,例如在一个方法中执行 foreach 循环,该方法将在节点完全附加到场景图并显示在屏幕上后执行,但我仍然不知道如何实现这个。

谢谢你。

4

1 回答 1

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;
            }
        }});
于 2013-06-05T17:48:48.407 回答