On Tue, 7 Apr 2026 17:10:04 GMT, Thiago Milczarek Sayao <[email protected]> 
wrote:

>> So the NPE is gone, very good.
>> 
>> What is not yet clear to me is how it chooses where to show the alert when 
>> the parent Stage is not shown.  Arguably, this is not a good state, so I'd 
>> expect the alert to show maybe at the center of the screen (which screen, 
>> btw, if we have two?)
>> 
>> So, using this reproducer
>> https://github.com/andy-goryachev-oracle/Test/blob/main/src/goryachev/bugs/Alert_NPE_8380926.java
>> 
>> where the NPE button focuses on a different stage before showing up the 
>> alert, I get the following picture (top menu / bottom dock is trimmed).  
>> Before clicking on the NPE button, I moved both of the windows from their 
>> original positions: 
>> 
>> <img width="1793" height="1068" alt="Screenshot 2026-04-07 at 09 27 30" 
>> src="https://github.com/user-attachments/assets/7119302a-6963-46ae-be8c-37d88f8aae1e";
>>  />
>> 
>> What I see is the alert showing up not at the center of the screen but 
>> somewhere closer to the top side of the screen.
>> Similarly, if I move both stages to a different screen, the alert still 
>> appears on the primary screen.
>> 
>> Why is that?
>
> @andy-goryachev-oracle 
> 
> I think it is the default behaviour. Y is placed on 1/3 of the screen.
> 
> From `Window.java`:
> 
> 
>     private static final float CENTER_ON_SCREEN_X_FRACTION = 1.0f / 2;
>     private static final float CENTER_ON_SCREEN_Y_FRACTION = 1.0f / 3;
> 
>     /**
>      * Sets x and y properties on this Window so that it is centered on the
>      * current screen.
>      * The current screen is determined from the intersection of current 
> window bounds and
>      * visual bounds of all screens.
>      */
>     public void centerOnScreen() {
>         xExplicit = false;
>         yExplicit = false;
>         if (peer != null) {
>             Rectangle2D bounds = getWindowScreen().getVisualBounds();
>             double centerX =
>                     bounds.getMinX() + (bounds.getWidth() - getWidth())
>                                            * CENTER_ON_SCREEN_X_FRACTION;
>             double centerY =
>                     bounds.getMinY() + (bounds.getHeight() - getHeight())
>                                            * CENTER_ON_SCREEN_Y_FRACTION;
> 
>             x.set(centerX);
>             y.set(centerY);
>             peerBoundsConfigurator.setLocation(centerX, centerY,
>                                                CENTER_ON_SCREEN_X_FRACTION,
>                                                CENTER_ON_SCREEN_Y_FRACTION);
>             applyBounds();
>         }
>     }
> 
> 
> I remember seeing some change about not moving parent window with the modal 
> on macos.

Thank you @tsayao , good to know.

Looks like this is a perfectly acceptable behavior, given that an alert with a 
non-visible Stage is a bad scenario to begin with.

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

PR Comment: https://git.openjdk.org/jfx/pull/2127#issuecomment-4200903035

Reply via email to