RFR: 8373688: Wrong render scale is used if Window is on another screen when Scene is sized [v3]
John Hendrikx
jhendrikx at openjdk.org
Tue Dec 16 20:20:15 UTC 2025
On Tue, 16 Dec 2025 07:44:53 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:
>> When a Window is created with a certain X/Y coordinate to place it on a specific screen, and is subsequently shown for the first time, one of the first things it does is size the window according to the size of the Scene. It does this based on the render scale of the *primary* screen as it has not moved the peer yet to the correct screen. After the scene has been sized, it is moved to the correct screen, triggering a change of render scale, but not a resizing of the Window (as this is only done once).
>>
>> The result of this is that due to slight difference in render scale, the size calculated for the scene may be a few pixels off. As the scene's preferred size is used for this calculation, even a few pixels too small can result in Labels being shown with ellipsis on the intended target screen with a different render scale.
>>
>> When observing the render scale X or Y property, one can observe a change from 1.0 (the default value) to 2.0 (the primary screen's render scale) to another value (depending on the target screen). However, the Window involved (being positioned by the user using setX()/setY() before it is shown) was never shown on the primary screen, yet the size calculation assumed it was.
>>
>> To solve this problem, the peer should be moved to the correct screen **before** asking the Scene for its preferred size to use as the initial Window size. Doing so (by adding an additional `applyBounds` call) also results in the render scale properties to only change once (or not at all) from their default value to the target screen's value (or not at all if the target screen is 1.0 scale).
>
> John Hendrikx has updated the pull request incrementally with one additional commit since the last revision:
>
> Add more debug output
Judging from how square the MT screen looks (700 x 700 orso), it seems that after the window is shown, it is not resizing it to fit the window. It is actually keeping the `sizeToScene` information (which it is supposed to ignore as you're setting sizes from preferences stored), or it is not triggering a resize even though the window is a totally different size than the scene. I think I can work with that to have a deeper look.
It's certainly odd, since I'm only moving the `applyBounds` call to be slightly earlier, so it uses the correct render scale. Later it does it again anyway. In my tests the calculated `sizeToScene` was usually larger than the Window settings, so perhaps shrinking the window works correctly, but not expanding it when it doesn't fit the scene.
-------------
PR Comment: https://git.openjdk.org/jfx/pull/2007#issuecomment-3662224281
More information about the openjfx-dev
mailing list