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

JavaFX GridPane删除行后getRowCount未缩减的问题咨询

解决JavaFX GridPane删除行后getRowCount()不缩减的问题

问题原因

GridPane的getRowCount()方法返回的是其rowCount属性值:

  • 当你往超出当前rowCount的行添加节点时,GridPane会自动扩展rowCount;
  • 但删除节点后,它不会自动缩减rowCount——因为无法判断你后续是否还要使用这些行;
  • 另外,仅删除目标行的节点后,下方节点的rowIndex并未自动上移,这也会导致GridPane的有效行数没有真正减少。

完整解决方案

要彻底解决这个问题,需要完成以下4步:

  1. 移除目标行的所有节点(你已经实现这一步)
  2. 将下方节点的rowIndex上移(填补删除行的空缺)
  3. 同步更新维护的节点列表(比如你的FileName、offset等ArrayList)
  4. 重新计算并设置GridPane的rowCount

代码实现

首先,写一个工具方法计算当前存在节点的最大行索引:

private int getCurrentMaxRowIndex(GridPane grid) {
    int maxRow = -1;
    for (Node node : grid.getChildren()) {
        Integer row = GridPane.getRowIndex(node);
        // 未设置rowIndex的节点默认行索引为0
        int currentRow = (row == null) ? 0 : row;
        if (currentRow > maxRow) {
            maxRow = currentRow;
        }
    }
    return maxRow;
}

然后执行完整的删除流程:

int index = // 你要删除的行索引

// 1. 移除目标行的所有节点
grid.getChildren().removeIf(node -> {
    Integer row = GridPane.getRowIndex(node);
    return (row == null && index == 0) || (row != null && row.equals(index));
});

// 2. 将所有行索引大于目标行的节点,rowIndex减1(上移一行)
for (Node node : grid.getChildren()) {
    Integer row = GridPane.getRowIndex(node);
    if (row != null && row > index) {
        GridPane.setRowIndex(node, row - 1);
    }
}

// 3. 同步更新你维护的节点列表
FileName.remove(index);
offset.remove(index);
volume.remove(index);
mute.remove(index);
erase.remove(index);

// 4. 重新计算并设置GridPane的rowCount
int maxRow = getCurrentMaxRowIndex(grid);
grid.setRowCount(maxRow == -1 ? 0 : maxRow + 1);

补充说明

  • 如果你后续还会动态添加行,无需手动设置rowCount——当你往新的行索引添加节点时,GridPane会自动扩展rowCount;
  • 未设置rowIndex的节点默认属于第0行,所以删除第0行时要额外处理这种情况(代码中已经覆盖)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:25:10