ADDITIONAL SYSTEM INFORMATION :
Windows 10
Java 24.0.1
JavaFX 24.0.1
A DESCRIPTION OF THE PROBLEM :
It seems that the SelectionMode enters an invalid state, when I removing TreeItems. In my example code i initialized a simple TreeTableView. I added a KeyEventHandler which removes the selected treeItems when I press delete. After that, the TreeTableViw hast a weird selection, and Exceptions are throwing, when i try to sort and after that to select cells
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run the code
2. Select 4 cells 2x2. Its important to select cells over more then 1 column. If your select cells only for one column, the bug is not reproducible
3. Press delete key
4. Click on one of the column headers to sort
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No Exception should be thrown and cells should be still selectable
ACTUAL -
1. Exception is throwing when i click on the column header:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: [ fromIndex: 0, toIndex: 2, size: 1 ]
at javafx.controls@24.0.1/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:162)
at javafx.base@24.0.1/javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:243)
at javafx.controls@24.0.1/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.getAddedElements(SelectedItemsReadOnlyObservableList.java:133)
at javafx.controls@24.0.1/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(SelectedItemsReadOnlyObservableList.java:55)
at javafx.base@24.0.1/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:327)
at javafx.base@24.0.1/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:71)
at javafx.base@24.0.1/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:246)
at javafx.base@24.0.1/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
2. After that I cant select any cells. Another Exception is throwing:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: bitIndex < 0: -1
at java.base/java.util.BitSet.get(BitSet.java:628)
at javafx.controls@24.0.1/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList.clear(MultipleSelectionModelBase.java:825)
at javafx.controls@24.0.1/javafx.scene.control.ControlUtils.lambda$updateSelectedIndices$2(ControlUtils.java:179)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfInt.accept(ForEachOps.java:207)
at java.base/java.util.stream.IntPipeline$10$1.accept(IntPipeline.java:396)
at java.base/java.util.stream.ReferencePipeline$4$1.accept(ReferencePipeline.java:232)
at java.base/java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:174)
at java.base/java.util.stream.IntPipeline$1$1.accept(IntPipeline.java:180)
---------- BEGIN SOURCE ----------
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TreeTableExample extends Application {
@Override
public void start(Stage primaryStage) {
TreeTableView<String> treeTableView = new TreeTableView<>();
treeTableView.getSelectionModel().setCellSelectionEnabled(true);
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
TreeTableColumn<String, String> column1 = new TreeTableColumn<>("Spalte 1");
TreeTableColumn<String, String> column2 = new TreeTableColumn<>("Spalte 2");
TreeTableColumn<String, String> column3 = new TreeTableColumn<>("Spalte 3");
TreeTableColumn<String, String> column4 = new TreeTableColumn<>("Spalte 4");
TreeTableColumn<String, String> column5 = new TreeTableColumn<>("Spalte 5");
column1.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column2.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column3.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column4.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column5.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
treeTableView.getColumns().addAll(column1, column2, column3, column4, column5);
// Root-Element (nicht sichtbar)
TreeItem<String> root = new TreeItem<>("String");
root.setExpanded(true);
// 30 Zeilen hinzufügen
for (int i = 1; i <= 30; i++) {
TreeItem<String> item = new TreeItem<>("String");
root.getChildren().add(item);
}
treeTableView.setRoot(root);
treeTableView.setShowRoot(false); // Root nicht anzeigen
VBox vbox = new VBox(treeTableView);
Scene scene = new Scene(vbox, 800, 600);
vbox.setOnKeyPressed(keyEvent -> {
if(keyEvent.getCode() == KeyCode.DELETE){
root.getChildren().removeAll(treeTableView.getSelectionModel().getSelectedItems());
}
});
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------
Windows 10
Java 24.0.1
JavaFX 24.0.1
A DESCRIPTION OF THE PROBLEM :
It seems that the SelectionMode enters an invalid state, when I removing TreeItems. In my example code i initialized a simple TreeTableView. I added a KeyEventHandler which removes the selected treeItems when I press delete. After that, the TreeTableViw hast a weird selection, and Exceptions are throwing, when i try to sort and after that to select cells
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run the code
2. Select 4 cells 2x2. Its important to select cells over more then 1 column. If your select cells only for one column, the bug is not reproducible
3. Press delete key
4. Click on one of the column headers to sort
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No Exception should be thrown and cells should be still selectable
ACTUAL -
1. Exception is throwing when i click on the column header:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: [ fromIndex: 0, toIndex: 2, size: 1 ]
at javafx.controls@24.0.1/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:162)
at javafx.base@24.0.1/javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:243)
at javafx.controls@24.0.1/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.getAddedElements(SelectedItemsReadOnlyObservableList.java:133)
at javafx.controls@24.0.1/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(SelectedItemsReadOnlyObservableList.java:55)
at javafx.base@24.0.1/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:327)
at javafx.base@24.0.1/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:71)
at javafx.base@24.0.1/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:246)
at javafx.base@24.0.1/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
2. After that I cant select any cells. Another Exception is throwing:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: bitIndex < 0: -1
at java.base/java.util.BitSet.get(BitSet.java:628)
at javafx.controls@24.0.1/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList.clear(MultipleSelectionModelBase.java:825)
at javafx.controls@24.0.1/javafx.scene.control.ControlUtils.lambda$updateSelectedIndices$2(ControlUtils.java:179)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfInt.accept(ForEachOps.java:207)
at java.base/java.util.stream.IntPipeline$10$1.accept(IntPipeline.java:396)
at java.base/java.util.stream.ReferencePipeline$4$1.accept(ReferencePipeline.java:232)
at java.base/java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:174)
at java.base/java.util.stream.IntPipeline$1$1.accept(IntPipeline.java:180)
---------- BEGIN SOURCE ----------
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TreeTableExample extends Application {
@Override
public void start(Stage primaryStage) {
TreeTableView<String> treeTableView = new TreeTableView<>();
treeTableView.getSelectionModel().setCellSelectionEnabled(true);
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
TreeTableColumn<String, String> column1 = new TreeTableColumn<>("Spalte 1");
TreeTableColumn<String, String> column2 = new TreeTableColumn<>("Spalte 2");
TreeTableColumn<String, String> column3 = new TreeTableColumn<>("Spalte 3");
TreeTableColumn<String, String> column4 = new TreeTableColumn<>("Spalte 4");
TreeTableColumn<String, String> column5 = new TreeTableColumn<>("Spalte 5");
column1.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column2.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column3.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column4.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
column5.setCellValueFactory(rowDataStringCellDataFeatures -> new SimpleStringProperty("value"));
treeTableView.getColumns().addAll(column1, column2, column3, column4, column5);
// Root-Element (nicht sichtbar)
TreeItem<String> root = new TreeItem<>("String");
root.setExpanded(true);
// 30 Zeilen hinzufügen
for (int i = 1; i <= 30; i++) {
TreeItem<String> item = new TreeItem<>("String");
root.getChildren().add(item);
}
treeTableView.setRoot(root);
treeTableView.setShowRoot(false); // Root nicht anzeigen
VBox vbox = new VBox(treeTableView);
Scene scene = new Scene(vbox, 800, 600);
vbox.setOnKeyPressed(keyEvent -> {
if(keyEvent.getCode() == KeyCode.DELETE){
root.getChildren().removeAll(treeTableView.getSelectionModel().getSelectedItems());
}
});
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------