ControlsFX SpreadsheetView rowspan IndexOutOfBoundsException

1k Views Asked by At

I am new to JavaFX and ControlsFX.

I am trying to create a very basic SpreadsheetView using the ControlsFX library. Following is the function to populate and create the 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)
}

On running it, I get the following error:

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

I know its happening because I am not adding any value for rowIndex=1 colIndex=1 (see the commented out line) ... but that is what I want.

The row0-col1 has a rowspan of 2 which should mean that even if my row1-col1 is absent, there shouldn't be any problem.

Why doesn't ControlsFX automatically take care of this?

If I uncomment that line, I get the following output:

enter image description here

Edit 1:

Also, I found another issue, when a colspan/rowspan occupies the whole column/row in the SpreadsheetView and then when one presses arrow key to navigate to cells you get an error:

enter image description here

The above situation arises when you press the right arrow key (Even though their isn't a cell on the right)

1

There are 1 best solutions below

0
On BEST ANSWER

Let me apologize because it is not well documented how span must be made in the SpreadsheetView. I will update the documentation.

If you want to span, you have to put the same cell in every cell inside the span. So either you build your own cell, and then in every place. In your case, you would add the same cell in row 0 column 1 and in row 1 column 1. Or you could keep your code, and simply call the method spanRow on the Grid. This method will automatically take your cell and place it accordingly.

Regarding the second issue, please submit it to our issue tracker so we can fix it : https://bitbucket.org/controlsfx/controlsfx/issues?status=new&status=open

If you have other issue regarding the SpreadsheetView, consider posting in our Google group where we will get notifications : http://groups.controlsfx.org