gpt4 book ai didi

java - 监听ListView中ScrollBar的变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:09 25 4
gpt4 key购买 nike

我正在尝试监听 ListView 的滚动条变化。我的第一次尝试是这样做

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

不过好像不行。我尝试使用调试器,发现EventHandler hash中的handle方法没有被调用。

我已经搜索了其他解决方案并找到了这个(https://gist.github.com/jewelsea/1684622),它是有效的,但是如果我将 for each 循环移动到 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;
}
}});

关于java - 监听ListView中ScrollBar的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com