ControlsFX SpreadsheetView rowspan IndexOutOfBoundsException

我是JavaFX和ControlsFX的新手。

我正在尝试使用ControlsFX库创建一个非常基本的SpreadsheetView。 以下是填充和创建SpreadsheetView的函数:

private fun spreadSheetFunc() : SpreadsheetView { val rowCount = 15 val columnCount = 10 val grid = GridBase(rowCount, columnCount) val rows = FXCollections.observableArrayList<ObservableList<SpreadsheetCell>>() var list = FXCollections.observableArrayList<SpreadsheetCell>() list.add(SpreadsheetCellType.STRING.createCell(0, 0, 1, 1, "row0-col0")) list.add(SpreadsheetCellType.STRING.createCell(0, 1, 2, 1, "row0-col1")) list.add(SpreadsheetCellType.STRING.createCell(0, 2, 1, 1, "row0-col2")) rows.add(list) list = FXCollections.observableArrayList() list.add(SpreadsheetCellType.STRING.createCell(1, 0, 1, 1, "row1-col0")) //commenting row1-col1 as row0-col1 has a rowspan of 2 //list.add(SpreadsheetCellType.STRING.createCell(1, 1, 1, 1, "row1-col1")) list.add(SpreadsheetCellType.STRING.createCell(1, 2, 1, 1, "row1-col2")) rows.add(list) list = FXCollections.observableArrayList() list.add(SpreadsheetCellType.STRING.createCell(2, 0, 1, 1, "row2-col0")) list.add(SpreadsheetCellType.STRING.createCell(2, 1, 1, 1, "row2-col1")) list.add(SpreadsheetCellType.STRING.createCell(2, 2, 1, 1, "row2-col2")) rows.add(list) list = FXCollections.observableArrayList() list.add(SpreadsheetCellType.STRING.createCell(3, 0, 1, 1, "row3-col0")) list.add(SpreadsheetCellType.STRING.createCell(3, 1, 1, 1, "row3-col1")) list.add(SpreadsheetCellType.STRING.createCell(3, 2, 1, 1, "row3-col2")) rows.add(list) grid.setRows(rows) return SpreadsheetView(grid) } 

在运行它,我得到以下错误:

java.lang.IndexOutOfBoundsException:Index:2,Size:2 at java.util.ArrayList.rangeCheck(ArrayList.java:653)

我知道它的发生,因为我没有为rowIndex = 1 colIndex = 1添加任何值(请参阅注释掉的行)…但这就是我想要的。

row0-col1 has a rowspan of 2 ,这意味着即使我的row1-col1不存在,也不应该有任何问题。

为什么ControlsFX不会自动处理这个问题?

如果我取消注释该行,我得到以下输出:

在这里输入图像描述

编辑1:

此外,我发现另一个问题,当colspan / rowspan占据SpreadsheetView中的整个列/行,然后当按下箭头键导航到单元格时,会出现错误:

在这里输入图像描述

当你按下右箭头键(即使它们不是右边的单元格)

让我道歉,因为没有很好的文件证明如何在SpreadsheetView中做跨度。 我将更新文档。

如果要跨度,则必须在跨度内的每个单元格中放置相同的单元格。 所以要么建立你自己的牢房,然后在每一个地方。 在你的情况下,你可以在第0行第1列和第1行第1列添加相同的单元格。或者你可以保留你的代码,并简单地调用Grid上的方法spanRow 。 这个方法会自动把你的单元格放在相应的位置。

关于第二个问题,请将其提交给我们的问题跟踪器,以便我们解决它: https : //bitbucket.org/controlsfx/controlsfx/issues?status=new&status=open

如果您有关于SpreadsheetView的其他问题,请考虑在我们的Google群组中发布我们将收到通知的地址: http : //groups.controlsfx.org

Interesting Posts