-
Bug
-
Resolution: Fixed
-
P3
-
8u144, 9
-
fx9-ea-180
The related JDK-8152396 is marked as resolved - but isn't for all cases, actually fixed for 2 children ...
To reproduce, take the example and increase the number of children:
childNode1.getChildren().addAll(
new TreeItem<String>("Node 1-1"),
new TreeItem<String>("Node 1-2"),
// new TreeItem<String>("Node 1-3"),
// new TreeItem<String>("Node 1-4"),
// new TreeItem<String>("Node 1-5"),
new TreeItem<String>("Node 1-last")
);
then expand/collapse until the exception with the same (modulo changes to the implementation managing the selectedItems, the current copied at the end) stacktrace as in the related issue is thrown - the number of exand/collapse cycles depends on the number of children:
for 3 children: happens in 5th expand
for 4 children: happens in 3th expand
(for >=5 children: happens in 1st collapse, but stacktrace different)
The underlying error is (still!) the incorrect change notification on remove (aka: collapse)
Listening to selectedItems with 4 children on expanding the selected parrent node, here the notification is correct, 4 items added to the list of selectedItems
List: { [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ], TreeItem [ value: Node 1-3 ], TreeItem [ value: Node 1-last ]] added at 1 }
cursor = 0
Kind of change: added
Affected range: [1, 5]
Added size: 4
Added sublist: [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ], TreeItem [ value: Node 1-3 ], TreeItem [ value: Node 1-last ]]
Listening to selectedItems with 4 children on collapsing the selected parent node, here the notification is incorrect, only the first two children included in the removed list
{ [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ]] removed at 1 }
cursor = 0
Kind of change: removed
Affected range: [1, 1]
Removed size: 2
Removed: [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ]]
The other way round: will pass (accidentally) for <= two children ..
Consequently, the filteredList gets out off sync.
The stacktrace:
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException
at java.base/java.lang.System.arraycopy(Native Method)
at javafx.base/javafx.collections.transformation.FilteredList.addRemove(FilteredList.java:274)
at javafx.base/javafx.collections.transformation.FilteredList.sourceChanged(FilteredList.java:144)
at javafx.base/javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106)
at javafx.base/javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.controls/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$1(SelectedItemsReadOnlyObservableList.java:103)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.controls/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(ReadOnlyUnbackedObservableList.java:63)
at javafx.controls/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(MultipleSelectionModelBase.java:895)
at javafx.controls/javafx.scene.control.ControlUtils.updateSelectedIndices(ControlUtils.java:202)
at javafx.controls/javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(TreeTableView.java:3352)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.base/javafx.collections.transformation.SortedList.sourceChanged(SortedList.java:111)
at javafx.base/javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106)
at javafx.base/javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.base/javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:102)
at javafx.controls/com.sun.javafx.scene.control.SelectedCellsMap.addAll(SelectedCellsMap.java:146)
at javafx.controls/javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.selectIndices(TreeTableView.java:2951)
at javafx.controls/javafx.scene.control.MultipleSelectionModel.selectRange(MultipleSelectionModel.java:180)
at de.swingempire.fx.scene.control.selection.TreeTableSelection_original_8152396.selectChildrenOfRows(TreeTableSelection_original_8152396.java:100)
To reproduce, take the example and increase the number of children:
childNode1.getChildren().addAll(
new TreeItem<String>("Node 1-1"),
new TreeItem<String>("Node 1-2"),
// new TreeItem<String>("Node 1-3"),
// new TreeItem<String>("Node 1-4"),
// new TreeItem<String>("Node 1-5"),
new TreeItem<String>("Node 1-last")
);
then expand/collapse until the exception with the same (modulo changes to the implementation managing the selectedItems, the current copied at the end) stacktrace as in the related issue is thrown - the number of exand/collapse cycles depends on the number of children:
for 3 children: happens in 5th expand
for 4 children: happens in 3th expand
(for >=5 children: happens in 1st collapse, but stacktrace different)
The underlying error is (still!) the incorrect change notification on remove (aka: collapse)
Listening to selectedItems with 4 children on expanding the selected parrent node, here the notification is correct, 4 items added to the list of selectedItems
List: { [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ], TreeItem [ value: Node 1-3 ], TreeItem [ value: Node 1-last ]] added at 1 }
cursor = 0
Kind of change: added
Affected range: [1, 5]
Added size: 4
Added sublist: [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ], TreeItem [ value: Node 1-3 ], TreeItem [ value: Node 1-last ]]
Listening to selectedItems with 4 children on collapsing the selected parent node, here the notification is incorrect, only the first two children included in the removed list
{ [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ]] removed at 1 }
cursor = 0
Kind of change: removed
Affected range: [1, 1]
Removed size: 2
Removed: [TreeItem [ value: Node 1-1 ], TreeItem [ value: Node 1-2 ]]
The other way round: will pass (accidentally) for <= two children ..
Consequently, the filteredList gets out off sync.
The stacktrace:
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException
at java.base/java.lang.System.arraycopy(Native Method)
at javafx.base/javafx.collections.transformation.FilteredList.addRemove(FilteredList.java:274)
at javafx.base/javafx.collections.transformation.FilteredList.sourceChanged(FilteredList.java:144)
at javafx.base/javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106)
at javafx.base/javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.controls/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$1(SelectedItemsReadOnlyObservableList.java:103)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.controls/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(ReadOnlyUnbackedObservableList.java:63)
at javafx.controls/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(MultipleSelectionModelBase.java:895)
at javafx.controls/javafx.scene.control.ControlUtils.updateSelectedIndices(ControlUtils.java:202)
at javafx.controls/javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(TreeTableView.java:3352)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.base/javafx.collections.transformation.SortedList.sourceChanged(SortedList.java:111)
at javafx.base/javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106)
at javafx.base/javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.base/javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:102)
at javafx.controls/com.sun.javafx.scene.control.SelectedCellsMap.addAll(SelectedCellsMap.java:146)
at javafx.controls/javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.selectIndices(TreeTableView.java:2951)
at javafx.controls/javafx.scene.control.MultipleSelectionModel.selectRange(MultipleSelectionModel.java:180)
at de.swingempire.fx.scene.control.selection.TreeTableSelection_original_8152396.selectChildrenOfRows(TreeTableSelection_original_8152396.java:100)
- relates to
-
JDK-8266811 Openjfx controls test build broken (Eclipse)
- Resolved
-
JDK-8189228 TreeView Multi-Selection does not work properly
- Closed
-
JDK-8248217 ☂ TreeTableView selection issues
- Open
-
JDK-8152396 ArrayIndexOutOfBoundsException when listening to selection changes on TreeTableView
- Resolved
-
JDK-8189228 TreeView Multi-Selection does not work properly
- Closed
(2 links to)