You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在NatTable中禁用冻结行的行选择,保留其余行可选?

如何在NatTable中禁用冻结行的行选择功能?

刚好之前处理过类似的需求,NatTable里控制特定行的选择权限,主要是通过选择过滤器或者自定义选择模型来实现,结合你使用CompositeFreezeLayer的场景,给你两种可行的方案:

方案一:使用ISelectionFilter过滤冻结行

ISelectionFilter是NatTable提供的通用选择控制接口,可以拦截所有选择请求,判断当前单元格/行是否允许被选择。结合CompositeFreezeLayer的冻结行数,我们可以直接过滤掉前N行(你的5行冻结行):

// 假设你的CompositeFreezeLayer实例为freezeLayer,SelectionLayer实例为selectionLayer
int frozenRowCount = freezeLayer.getFreezeRowCount(); // 获取已冻结的行数,这里是5

// 自定义选择过滤器
ISelectionFilter frozenRowFilter = new ISelectionFilter() {
    @Override
    public boolean isAllowed(int columnPosition, int rowPosition, ILayer layer) {
        // 将当前层的行位置转换为底层数据模型的行索引
        int rowIndex = layer.getRowIndexByPosition(rowPosition);
        // 只允许行索引大于等于冻结行数的行被选择
        return rowIndex >= frozenRowCount;
    }
};

// 给SelectionLayer设置过滤器
selectionLayer.setSelectionFilter(frozenRowFilter);

这个方案的优势是同时控制单元格选择和行选择,不管是点击单元格还是行头,冻结行都会被拦截,无法被选中。

方案二:自定义SelectionModel针对行选择控制

如果你只需要控制行选择(比如行头点击),可以直接自定义DefaultSelectionModel,重写行选择判断逻辑:

// 同样先获取冻结行数
int frozenRowCount = freezeLayer.getFreezeRowCount();

// 自定义选择模型
selectionLayer.setSelectionModel(new DefaultSelectionModel() {
    @Override
    protected boolean isRowPositionSelectable(int rowPosition) {
        // 转换为底层行索引,判断是否在冻结区域外
        int rowIndex = selectionLayer.getRowIndexByPosition(rowPosition);
        return rowIndex >= frozenRowCount;
    }
});

这种方式更聚焦于行选择场景,适合只需要禁用行头选择冻结行,但允许点击冻结行单元格的需求(不过你的需求是禁用冻结行的选择,所以方案一更合适)。

注意事项

  • 坐标转换:NatTable的rowPosition是当前层的位置,需要用getRowIndexByPosition()转换为底层数据模型的索引,避免因为层的偏移导致判断错误。
  • 配置时机:确保在NatTable初始化完成后设置这些过滤器/模型,或者在SelectionLayer的配置类中添加(比如继承DefaultSelectionLayerConfiguration,在addSelectionHandling方法中设置)。

这样设置后,你的前5行冻结行就会完全无法被选择,剩下的10行可以正常使用行/单元格选择功能啦。

内容的提问来源于stack exchange,提问作者mahesh bhagirath

火山引擎 最新活动