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

TreeTableView: must select leaf row on click into indentation region

XMLWordPrintable

      .. but doesn't (after row was re-used?). To reproduce, compile and run the example below

      - click into leading empty space on any of visible leafs (root or expanded child)
      - expected and actual: leaf selected
      - expand a collapsed child, click into leading empty space of any of its leaf children
      - expected: child leaf selected
      - actual: child leaf not selected

      The technical issue is a mixture:
      - TreeTableRowSkin manages the disclosure node, seems to try to remove it if not needed but fails (when/why exactly?). At least it seems to toggle the disclosure's visibility reliably
      - TreeTableCellBehavior does the hit-detection on the disclosure node if added to the row

      Seems to be virulent since ages (checked against fx11 and fx8). Priority set to 3 because it's an UX issue and nothing an application developer can workaround.

      A quick fix is to let the hit-detection check both existence and visibility. A cleaner fix (off scope for this, extracted to ??) would cleanup the missing removal (and possibly other layout issues around graphic/indentation in Tree/Table). A real fix might also cleanup the smeared responsibility across several collaborators)

      The example (modified from https://stackoverflow.com/q/63964556/203657):

      public class TreeTableLeafSelectionWithMouseBug extends Application {

          @Override
          public void start(Stage primaryStage) {
              // TreeTableView
              TreeTableView<String> treeTableView = new TreeTableView<>(new TreeItem<>("Root"));
              // column
              TreeTableColumn<String, String> primaryColumn = new TreeTableColumn<>("Col1");
              primaryColumn.setCellValueFactory(call -> new ReadOnlyStringWrapper(call.getValue().getValue()));
              treeTableView.getColumns().add(primaryColumn);

              fillTree(treeTableView.getRoot());

              HBox content = new HBox(10, treeTableView);
              Scene scene = new Scene(content);
              primaryStage.setScene(scene);
              primaryStage.show();
          }

          protected void fillTree(TreeItem<String> root) {
              root.setExpanded(true);
              root.getChildren().add(0, new TreeItem<>("leafChild"));
              for (int i = 0; i < 10; i++) {
                  TreeItem<String> newChild = new TreeItem<>("child " + i);
                  if (i == 0) newChild.setExpanded(true);
                  root.getChildren().add(newChild);
                  for (int j = 0; j < 3; j++) {
                      TreeItem<String> newChild2 = new TreeItem<>(i + " grandChild " + j);
                      newChild.getChildren().add(newChild2);
                  }
              }
          }

          public static void main(String[] args) {
              launch(args);
          }
      }

            fastegal Jeanette Winzenburg
            fastegal Jeanette Winzenburg
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: