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