Skip to content

Commit 2e56cc0

Browse files
author
Jose Pereda
committed
8251481: TableCell accessing row: NPE on auto-sizing
Reviewed-by: jvos Backport-of: 59cd8ec
1 parent f652155 commit 2e56cc0

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

modules/javafx.controls/src/main/java/javafx/scene/control/skin/TableColumnHeader.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -56,6 +56,7 @@
5656
import javafx.scene.control.TableCell;
5757
import javafx.scene.control.TableColumn;
5858
import javafx.scene.control.TableColumnBase;
59+
import javafx.scene.control.TableRow;
5960
import javafx.scene.control.TableView;
6061
import javafx.scene.control.TreeTableCell;
6162
import javafx.scene.control.TreeTableColumn;
@@ -654,11 +655,17 @@ private <T,S> void resizeColumnToFitContent(TableView<T> tv, TableColumn<T, S> t
654655
padding = r.snappedLeftInset() + r.snappedRightInset();
655656
}
656657

658+
TableRow<T> tableRow = new TableRow<>();
659+
tableRow.updateTableView(tv);
660+
657661
int rows = maxRows == -1 ? items.size() : Math.min(items.size(), maxRows);
658662
double maxWidth = 0;
659663
for (int row = 0; row < rows; row++) {
664+
tableRow.updateIndex(row);
665+
660666
cell.updateTableColumn(tc);
661667
cell.updateTableView(tv);
668+
cell.updateTableRow(tableRow);
662669
cell.updateIndex(row);
663670

664671
if ((cell.getText() != null && !cell.getText().isEmpty()) || cell.getGraphic() != null) {

modules/javafx.controls/src/test/java/test/javafx/scene/control/TableCellTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,27 @@ private void test_rt36715_cellPropertiesMirrorTableColumnProperties(
340340
cell.setSkin(new TableCellSkin(cell));
341341
}
342342

343+
/**
344+
* The {@link TableRow} should never be null inside the {@link TableCell} during auto sizing.
345+
* Note: The auto sizing is triggered as soon as the table has a scene - so when the {@link StageLoader} is created.
346+
* See also: JDK-8251481
347+
*/
348+
@Test
349+
public void testRowIsNotNullWhenAutoSizing() {
350+
TableColumn<String, String> tableColumn = new TableColumn<>();
351+
tableColumn.setCellFactory(col -> new TableCell<>() {
352+
@Override
353+
protected void updateItem(String item, boolean empty) {
354+
super.updateItem(item, empty);
355+
356+
assertNotNull(getTableRow());
357+
}
358+
});
359+
table.getColumns().add(tableColumn);
360+
361+
stageLoader = new StageLoader(table);
362+
}
363+
343364
/**
344365
* Table: Editable<br>
345366
* Row: Not editable<br>

modules/javafx.controls/src/test/java/test/javafx/scene/control/TreeTableCellTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,27 @@ private void test_rt36715_cellPropertiesMirrorTableColumnProperties(
673673
cell.setSkin(new TreeTableCellSkin(cell));
674674
}
675675

676+
/**
677+
* The {@link TreeTableRow} should never be null inside the {@link TreeTableCell} during auto sizing.
678+
* Note: The auto sizing is triggered as soon as the table has a scene - so when the {@link StageLoader} is created.
679+
* See also: JDK-8251481
680+
*/
681+
@Test
682+
public void testRowIsNotNullWhenAutoSizing() {
683+
TreeTableColumn<String, String> treeTableColumn = new TreeTableColumn<>();
684+
treeTableColumn.setCellFactory(col -> new TreeTableCell<>() {
685+
@Override
686+
protected void updateItem(String item, boolean empty) {
687+
super.updateItem(item, empty);
688+
689+
assertNotNull(getTableRow());
690+
}
691+
});
692+
tree.getColumns().add(treeTableColumn);
693+
694+
stageLoader = new StageLoader(tree);
695+
}
696+
676697
/**
677698
* Table: Editable<br>
678699
* Row: Not editable<br>

0 commit comments

Comments
 (0)