如何确定用户是否滚动到ListView的末尾

时间:2016-02-14 14:10:22

标签: listview javafx-8

正如标题所说。如何找出用户在javafx中滚动到列表视图的末尾。

1 个答案:

答案 0 :(得分:1)

在我的评论中详细说明一下:看看API我的第一个冲动就是在到达末尾时使用list和doStuff()注册一个onScrollTo处理程序,比如

list.setOnScrollTo(e -> {
    if (e.getScrollTarget() >= list.getItems().size() -1) {
        doStuff(); 
    }  
});

不幸的是,这不起作用:如果方法list.scrollTo(int)list.scrollTo(T)中的任何一个,则处理程序仅被称为 。这已经记录了 - 但是我们不会想到我们需要它的任何用例吗?

这留下了肮脏的ol'从列表的子项中挖掘ScrollBar并聆听其value属性(注意:在安装外观之后需要进行挖掘工作!)。

一个简单的例子:

public class ScrollToHandlerList extends Application {
    private final ObservableList<Locale> data =
            FXCollections.observableArrayList(Locale.getAvailableLocales());

    private final ListView<Locale> list = new ListView<>(data);

    @Override
    public void start(Stage stage) {
        stage.setTitle("List ScrollTo Handler " + FXUtils.version());
        Button leftScrollTo = new Button("scrollto last");
        leftScrollTo.setOnAction(e -> {
            // explicit calling notifies the onScrollHandler
            list.scrollTo(list.getItems().size() -1);
        });
        // Would expect a onScrollTo handler getting notified
        // but isn't ...
        list.setOnScrollTo(e -> {
            LOG.info("target/size" + e.getScrollTarget() + " / " + data.size());
        });
        // nor a onScroll handler ...
        list.setOnScroll(e -> {
            LOG.info("" + e);
        });
        HBox root = new HBox(leftScrollTo, list);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();

        // dirty: lookup the scrollBar and listener to its value property
        ScrollBar bar = (ScrollBar) list.lookup(".scroll-bar");
        bar.valueProperty().addListener((src, ov, nv) -> {
            LOG.info("change on value " + nv);
            if (nv.doubleValue() == 1.) {
                LOG.info("at max");
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
    @SuppressWarnings("unused")
    private static final Logger LOG = Logger.getLogger(ScrollToHandlerList.class
            .getName());
}

更新

通过twitter获取更多信息:

  • 没有通知滚动事件是intentional,实际上滚动条中的事件被VirtualFlow阻止
  • 只有solution using public api,基本上让细胞本身知道到达滚动区域的末尾