Java 侦听ListView中滚动条的更改

Java 侦听ListView中滚动条的更改,java,listview,javafx,javafx-2,Java,Listview,Javafx,Javafx 2,我正在尝试侦听列表视图的滚动条更改。我的第一次尝试就是这样做 listView.setOnScroll(new EventHandler<ScrollEvent>() { // Code ommited } listView.setOnScroll(新的EventHandler() {//Code ommited} 但是它似乎不起作用。我尝试使用调试器,发现EventHandler哈希中的handle方法没有被调用 我搜索了其他解决方案,发现这个()是可行的,但是如果我将for

我正在尝试侦听列表视图的滚动条更改。我的第一次尝试就是这样做

listView.setOnScroll(new EventHandler<ScrollEvent>()
{ // Code ommited }
listView.setOnScroll(新的EventHandler()
{//Code ommited}
但是它似乎不起作用。我尝试使用调试器,发现EventHandler哈希中的handle方法没有被调用

我搜索了其他解决方案,发现这个()是可行的,但是如果我将for each循环移动到primaryStage.show()之前的位置,它就不起作用了。因此,对于我的用例来说,这不是理想的解决方案,因为我已经将UI代码拆分为许多子组件,我需要在调用primaryStage.show()之前设置侦听器(我不想将listview实例公开给主应用程序类)

我认为问题是因为lookUpAll方法只有在节点已经在舞台上显示时才起作用。我想到了一些解决方法,比如在一个方法中执行foreach循环,该方法将在节点完全连接到场景图并显示在屏幕上后执行,但我仍然不知道如何实现这一点


谢谢。

假设将
阶段
传递给创建
列表视图
的方法,您可以使用
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;
            }
        }});
observeListNames=FXCollections.observearraylist(“1”、“2”、“3”、“4”、“5”、“6”、“7”);
最终ListView ListView=新ListView(名称);
stage.setOnShown(新的EventHandler(){
布尔hasRun=false;
@凌驾
公共无效句柄(WindowEvent arg0){
如果(!hasRun){
对于(节点:listView.lookupAll(“.scroll bar”)){
if(滚动条的节点实例){
最终滚动条=(滚动条)节点;
bar.valueProperty().addListener(新的ChangeListener()){

@Override public void changed(ObservalEvalue)不是asnwer,而是相关的。这种方法对您有帮助吗?或者,在主应用程序类中,获取listview fxml的控制器,并在stage.show()之后调用controller.initcomponents()。还有另一个答案。