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

TreeTableView: must select leaf row on click into indentation region





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

            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()));


                HBox content = new HBox(10, treeTableView);
                Scene scene = new Scene(content);

            protected void fillTree(TreeItem<String> root) {
                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);
                    for (int j = 0; j < 3; j++) {
                        TreeItem<String> newChild2 = new TreeItem<>(i + " grandChild " + j);

            public static void main(String[] args) {


          Issue Links



                fastegal Jeanette Winzenburg
                fastegal Jeanette Winzenburg
                0 Vote for this issue
                2 Start watching this issue