【问题标题】:ListView auto-scroll only working when manually scrolled to the bottom onceListView 自动滚动仅在手动滚动到底部一次时有效
【发布时间】:2020-01-03 17:47:16
【问题描述】:

我对 JavaFX ListView 组件做了一个扩展:

HL7ListView extends ListView<String>

目标是让它在添加新项目时自动滚动父 ScrollPane。我有一个构造函数,它将相关的 ScrollPane 作为参数,并且我创建了一个 addItem() 方法,如下所示:

public void addItem(String item)
{
    List<String> items = getItems();
    items.add(item);

    scrollTo(items.size());

    scrollPane.setVvalue(1.0);
}

自动滚动仅在我手动滚动到底部一次以“开始”时才有效,如果这有意义的话。一旦它滚动到底部,新项目就会按预期运行,并且滚动条会自动下降,尾随 ListView 的内容。不确定这里可能是什么问题,显然滚动条仅在需要时才会出现,不确定这是否与此有关。

有什么想法吗?

【问题讨论】:

    标签: listview javafx autoscroll scrollpane


    【解决方案1】:

    我认为您不需要将 ListView 与父 ScrollPane 包装在一起,因为 ListView 具有内置的滚动条。您可以使用scrollTo() 直接滚动到最后一个索引。

    ListView<String> listView = new ListView<>();
    listView.getItems().addAll(items);
    
    listView.scrollTo(listView.getItems().size() - 1);
    

    编辑

    使用 super.scrollTo 而不是 this.scrollTo 似乎也适用于您的扩展 (HL7ListView),

    class HL7ListView extends ListView<String> {
    
        public HL7ListView() {
        }
    
        public HL7ListView(List<String> items) {
            this.getItems().addAll(items);
            super.scrollTo(getItems().size() - 1);
        }
    
        public void addItem(String item) {
            this.getItems().add(item);
            super.scrollTo(getItems().size() - 1);
    
        }
    }
    

    PS:我尝试使用 ScrollPane 作为您的方法,并通过了this QA - 这不起作用,这似乎有点错误。

    【讨论】:

    • 我将 scrollTo 更改为 size - 1 并删除了滚动窗格上的 setVvalue 调用,但我仍然看到相同的行为。只有当我手动向下滚动到滚动条出现时,它才会开始拖尾。
    • @Martin 我的错!我直接使用列表视图进行了测试并设置了size-1 并且有效,我认为扩展 ListView 应该具有相同的行为,但它不起作用(不知道为什么)。也许我不得不使用super.scrollTo - 无论如何,我更新了代码,运行顺利。
    • 我让它工作了!我意识到我仍在调用 getItems().add() 而不是我的自定义 addItem() 方法 (DOH)。我删除了 ScrollPane 并用一个简单的 BorderPane 替换它,你是对的,它完全没有必要并且 ListView 有自己的滚动条。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 2014-12-12
    • 2016-11-13
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2016-09-15
    相关资源
    最近更新 更多