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

TreeTableView: must select leaf row on click into indentation region

    XMLWordPrintable

Details

    Backports

      Description

        .. 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);
            }
        }

        Attachments

          Issue Links

            Activity

              People

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

                Dates

                  Created:
                  Updated:
                  Resolved: