On Sun, 21 Dec 2025 17:41:44 GMT, John Hendrikx <[email protected]> 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:
> 
>   Avoid NaN's when determining screen

On macOS the window's size is tracked in logical coordinates, not pixels. When 
you move a window to another screen you typically won't get `notifyResize` on 
either the Window or View since as far as the OS is concerned the size didn't 
change. Windows and Linux work in pixels and will almost always send 
`notifyResize` when a window changes screens. That might explain the difference 
in behavior that you're seeing.

Can't test this on Linux right now. Something is going wrong when Linux is 
configured with multiple screens at different scales. JavaFX recognizes when a 
window changes screens but doesn't update the window size or scaling factors.

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

PR Comment: https://git.openjdk.org/jfx/pull/2007#issuecomment-3679465172

Reply via email to