RFR: JDK-8186188: TableColumHeader: initial auto-size broken if has graphic [v4]

Andy Goryachev angorya at openjdk.org
Fri Mar 22 23:10:31 UTC 2024


On Wed, 20 Mar 2024 19:53:40 GMT, Marius Hanl <mhanl at openjdk.org> wrote:

>> This PR fixes the issue that the initial column autosizing is wrong under some circumstances.
>> The following things will break the initial autosizing:
>> - Bold Column text (that is where I initially found this problem)
>> - Another font / font size
>> - Graphic
>> 
>> The reason is actually quite simple: The CSS is not (yet) applied initially, we therefore ALWAYS take the default font into account + the graphic is not yet layouted as well.
>> 
>> _It was not so easy to write tests for this, also for me the `test_resizeColumnToFitContentHeader` is always failing locally. I don't know what happens here, but he seems to not find a (Stub?) `Font` for me._
>> **EDIT: Found out the cause and fixed it. I will check if I can write more tests since it works now. :)**
>> 
>> The test I wrote now is checking if the css is applied after we triggered the autosize, which is what we would expect here since we measure text.
>> 
>> I also copied the `TableColumnHeaderTest` and rewrote the tests for `TreeTableView` as well, so we can catch any errors here as well since they both use different code (although it is technically the same - C&P errors can happen very easy).
>
> Marius Hanl has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - JDK-8186188: copyright
>  - JDK-8186188: fix tests

the main question is whether this PR depends on #1422, or whether the unrelated changes need to be removed.

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

> 684:         TableColumnHeader header = tableSkin.getTableHeaderRow().getColumnHeaderFor(tc);
> 685:         header.applyCss();
> 686:         double headerWidth = header.label.prefWidth(-1) + 10;

should we extract this magic constant (along with the comment)?
although this might be outside of the scope of this PR, lines 651, 744.

modules/javafx.controls/src/test/java/test/javafx/scene/chart/AreaChartTest.java line 537:

> 535:                 .map(pathElement -> (LineTo) pathElement)
> 536:                 .map(lineTo -> new Point2D(
> 537:                         Math.round(xAxis.getValueForDisplay(lineTo.getX()).doubleValue()),

please revert the unrelated changes (moved to #1422)

modules/javafx.controls/src/test/java/test/javafx/scene/chart/StackedBarChartTest.java line 111:

> 109:         String bounds = computeBoundsString((Region)childrenList.get(0), (Region)childrenList.get(1),
> 110:                 (Region)childrenList.get(2));
> 111:         assertEquals("10 453 218 35 238 409 218 79 465 355 218 133 ", bounds);

unrelated

modules/javafx.controls/src/test/java/test/javafx/scene/control/TextInputControlTest.java line 158:

> 156:         Scene s = new Scene(textInput);
> 157:         textInput.applyCss();
> 158:         assertEquals(Font.font("Amble", 24), textInput.getFont());

unrelated

modules/javafx.controls/src/test/java/test/javafx/scene/control/skin/TableColumnHeaderTreeTableTest.java line 48:

> 46: import javafx.scene.layout.HBox;
> 47: import javafx.scene.text.Text;
> 48: import org.junit.After;

this is a new test - should we use JUnit5?

modules/javafx.controls/src/test/java/test/javafx/scene/control/skin/TableColumnHeaderTreeTableTest.java line 64:

> 62:     private TableColumnHeader firstColumnHeader;
> 63:     private TreeTableView<Person> tableView;
> 64:     private StageLoader sl;

minor: this field should probably be named `stageLoader`

modules/javafx.controls/src/test/java/test/javafx/scene/control/skin/TableColumnHeaderTreeTableTest.java line 153:

> 151: 
> 152:         assertEquals("Width must be the same",
> 153:                 width, column.getWidth(), 0.001);

maybe a constant, here and elsewhere

private static final double EPSILON = 0.001;

?

modules/javafx.graphics/src/test/java/test/com/sun/javafx/pgstub/StubFontLoader.java line 53:

> 51:         if (name.equals("system regular")) {
> 52:             FontHelper.setNativeFont(font, nativeFont, font.getName(), "System", "Regular");
> 53:         } else if (name.equals("system bold")) {

does this mean this PR requires #1422 to be integrated first?

-------------

PR Review: https://git.openjdk.org/jfx/pull/1405#pullrequestreview-1955910101
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536295365
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536296972
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536297127
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536297778
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536298798
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536299480
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536300462
PR Review Comment: https://git.openjdk.org/jfx/pull/1405#discussion_r1536315771


More information about the openjfx-dev mailing list