You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除VirtualFlow中的垂直滚动条?

如何移除VirtualFlow中的垂直滚动条?

嘿,我看你尝试用getVbar().setVisible(false)来隐藏垂直滚动条但没生效,这大概率是因为VirtualFlow的滚动条在构造函数阶段还没完成初始化,所以你那时候设置可见性根本没起作用。咱们来用更靠谱的方法解决这个问题:

方法一:直接禁用垂直滚动条(推荐)

VirtualFlow本身提供了滚动条策略的配置,直接把垂直滚动条的策略设为NEVER,就能让系统完全不渲染垂直滚动条,这比单纯隐藏要彻底得多:

private static class MyVirtualFlow extends VirtualFlow<VirtualCell> {
    public MyVirtualFlow() {
        setVertical(false);
        // 直接禁用垂直滚动条,不会创建也不会显示
        setVbarPolicy(ScrollBarPolicy.NEVER);
    }
}

方法二:等Skin初始化后再隐藏滚动条

如果因为某些原因不能用滚动条策略,那可以等VirtualFlow的Skin初始化完成后,再去设置滚动条的可见性和管理状态(避免滚动条占空间):

private static class MyVirtualFlow extends VirtualFlow<VirtualCell> {
    public MyVirtualFlow() {
        setVertical(false);
        // 监听Skin的变化,等Skin初始化完成后处理滚动条
        skinProperty().addListener((obs, oldSkin, newSkin) -> {
            if (newSkin != null) {
                ScrollBar vbar = getVbar();
                vbar.setVisible(false);
                vbar.setManaged(false); // 取消滚动条的布局管理,避免占位置
            }
        });
    }
}

顺便提个小建议

你的代码里两次调用了setCellFactory,第二次会完全覆盖第一次的设置,其实可以把逻辑合并成一个,比如:

virtualFlow.setCellFactory(vf -> new VirtualCell() {
    @Override
    public void updateIndex(int index) {
        super.updateIndex(index);
        if (index >= 0 && index < items.size()) {
            updateItem(items.get(index), false);
        } else {
            updateItem(null, true);
        }
    }
});

这样代码更简洁,也不会有重复设置的问题~

备注:内容来源于stack exchange,提问作者SilverCube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:09:30