On Wed, 13 Nov 2024 18:10:30 GMT, Andy Goryachev <ango...@openjdk.org> wrote:
>> This PR fixes a bug where the `TableCell` indices can be outdated (not >> synchronized) with the `TableRow` index. >> >> What normally happens is: >> - Index is changed: Cell update is requested when the row is empty >> (otherwise noop) >> - Item is changed: Cell update is requested, which will now update the >> indices of the underlying `TableCells` >> >> Under some circumstances, when a `TableRow` is reused (e.g. index 60 -> 1) >> the item can be the same >> -> `oldIndex != newIndex && oldItem == newItem` >> This can happen when the items of a `TableView` are changed, but some items >> are the same in both item lists (Think about a filter, where we filter down >> 60 to 2 items). >> >> -> In this scenario, the cell update is not triggered, so the underlying >> `TableCell` indices will not be updated ever (e.g. they still have index 60 >> set, but the row has 1 now). >> >> The fix is to always update the underlying `TableCell` indices when the >> `TableRow` index changed. >> While usually the item is different when the index changed, this is not >> always the case (there is no guarantee that the item changed, as we can see >> in the example, where the cell is reused). >> >> --- >> >> Also made sure that the issues linked in the code and ticket do not regress: >> - https://bugs.openjdk.org/browse/JDK-8095357 >> - https://bugs.openjdk.org/browse/JDK-8115269 > > modules/javafx.controls/src/test/java/test/javafx/scene/control/TableViewRowTest.java > line 222: > >> 220: row.updateIndex(0); >> 221: >> 222: List<TableCell<String, String>> cells = >> row.getChildrenUnmodifiable().stream(). > > minor suggestion: maybe reformat to keep one statement per line > > > row.getChildrenUnmodifiable().stream(). > filter(TableCell.class::isInstance). > map(e -> (TableCell<String, String>) e). > toList(); (here and elsewhere) ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1635#discussion_r1840949564