Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8361490

Sorting and selecting cells does not work after removing TreeItems

XMLWordPrintable

    • generic
    • generic

      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 ----------

            angorya Andy Goryachev
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: