diff --git a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TreeTableViewSkin.java b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TreeTableViewSkin.java index e8a80754813..f9a660de45d 100644 --- a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TreeTableViewSkin.java +++ b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/TreeTableViewSkin.java @@ -69,7 +69,7 @@ public class TreeTableViewSkin extends TableViewSkinBase, Tree ObjectProperty>> tableBackingListProperty; private final TreeTableViewBehavior behavior; private final EventHandler> rootListener; - + private boolean treeStructureDirty; /* ************************************************************************* @@ -146,6 +146,11 @@ public TreeTableViewSkin(final TreeTableView control) { markItemCountDirty(); control.requestLayout(); break; + } else if (eventType.equals(TreeItem.childrenModificationEvent())) { + markItemCountDirty(); + treeStructureDirty = true; + control.requestLayout(); + break; } eventType = eventType.getSuperType(); } @@ -347,6 +352,10 @@ private TreeTableRow createCell() { // A unit test exists in TreeTableViewTest to ensure that // the performance issue covered in JDK-8147483 doesn't regress. // requestRebuildCells(); + treeStructureDirty = false; + } else if (treeStructureDirty) { + requestRebuildCells(); + treeStructureDirty = false; } else { needCellsReconfigured = true; } diff --git a/modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java b/modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java index d5946742da3..d6900c20e3e 100644 --- a/modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java +++ b/modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java @@ -6439,6 +6439,57 @@ private void test_rt_40319(boolean toRight, boolean toBottom, boolean useMouse) sl.dispose(); } + /** + * Reparenting a TreeItem must update its indentation in the TreeTableView. + * See also: JDK-8356770 + */ + @Test + void testIndentationUpdateAfterReparenting() { + TreeItem itemA1 = new TreeItem<>("item A1"); + TreeItem itemA2 = new TreeItem<>("item A2"); + TreeItem itemA = new TreeItem<>("item A"); + itemA.getChildren().addAll(itemA1, itemA2); + itemA.setExpanded(true); + + TreeItem itemB1 = new TreeItem<>("item B1"); + TreeItem itemB2 = new TreeItem<>("item B2"); + TreeItem itemB = new TreeItem<>("item B"); + itemB.getChildren().addAll(itemB1, itemB2); + itemB.setExpanded(true); + + TreeItem root = new TreeItem<>("Root"); + root.getChildren().addAll(itemA, itemB); + root.setExpanded(true); + + TreeTableView table = new TreeTableView<>(); + TreeTableColumn col = new TreeTableColumn<>("Name"); + col.setCellValueFactory(cd -> new SimpleStringProperty(cd.getValue().getValue())); + table.getColumns().add(col); + table.setRoot(root); + table.setShowRoot(true); + + stageLoader = new StageLoader(table); + + // Find "item B" row and record its disclosure node indent + double xBefore = disclosureIndent(table, 4); + + // Reparenting "item B" under "item A" + root.getChildren().remove(itemB); + itemA.getChildren().add(itemB); + Toolkit.getToolkit().firePulse(); + + double xAfter = disclosureIndent(table, 4); + + assertTrue(xAfter > xBefore, + "Indentation of item B must increase after reparenting"); + } + + private double disclosureIndent(TreeTableView table, int index) { + TreeTableRow row = (TreeTableRow) VirtualFlowTestUtils.getVirtualFlow(table).getVisibleCell(index); + Node disclosureNode = row.getDisclosureNode(); + return disclosureNode == null ? 0.0 : (disclosureNode.getLayoutX() + disclosureNode.getTranslateX()); + } + @Test public void test_jdk_8144681_removeColumn() { TreeTableView table = new TreeTableView<>();