Hi Martin, Just to say thanks for looking into it and the following explanation, it's good to know. There's some quirks to be aware of for sure.
Kind Regards, Cormac On Mon, 7 Jul 2025 at 15:50, Martin Fox <martinfox...@gmail.com> wrote: > Cormac, > > When you call Dialog.show everything happens in the order you expect. When > you call Dialog.showAndWait the order of operations changes. For one, the > Dialog code issues the DIALOG_SHOWN event *before* showing the window (it > wants to send out that event before an internal call to Window.showAndWait > blocks). For two, when Window.sizeToScene is called on a window that’s not > yet visible it gets deferred. The end result is that with > Dialog.showAndWait your onShown handler gets called before the window is > sized to the scene but when you use Dialog.show your onShown handler is > called after. > > I don’t think any of this is documented. I've run into the deferred > sizeToScene behavior before. I didn’t dig much but it looks like it was > added over a decade ago in response to some bug reports. The timing of > Dialog.setOnShown is also old behavior. There’s a comment in the > Dialog.java about this: > > // this is slightly odd - we fire the SHOWN event before the show() > // call, so that users get the event before the dialog blocks > > > So I can see what’s going on in case #2. Due to the re-ordering the > sizeToScene logic is happening after the window’s minimum size is set. The > docs don’t say what should happen if the scene’s desired size is less than > the window’s minimum. What you’re getting is a scene that doesn’t fill the > window. One work-around for case 2 is to call setOnShown on the dialog’s > window instead of the dialog itself. > > BTW, I think what you’re seeing in case #3 is correct and not a bug. > You’re altering the size of the scene after the window has been sized and > shown. I wouldn’t expect the window to automatically re-size to match the > new scene dimensions. I think the expectation is that you would alter the > scene’s dimensions in onShowing instead of onShown. > > Martin > > On Jul 3, 2025, at 2:24 PM, Cormac Redmond <credm...@certak.com> wrote: > > Hi, > > I have noticed inconsistent and confusing size/layout behaviour with > Dialogs when changing min width or height (after shown). > > The behaviour depends on whether changing min width/height on the Stage, > or the DialogPane itself, and whether show() or showAndWait() is used. > > In summary: > > 1. Set Stage mins + show() > - no bug > 2. Set Stage mins + showAndWait() > - improper layout: background applies only to label (i.e., size > before re-size), button wrong position, re-sizing window fixes the > problem > 3. 3 Set DialogPane mins + show() > - min sizes are ignored, button is visible, until it comes into > focus, and then the button disappears, you can find it if you resize > window > close to the mins set > 4. 4 Set DialogPane mins + showAndWait() > - no bug > > It's happening in JFX23/24/25. Note, these may seem trivial/fixable, or > you may ask "why would you do that?", but there are reasons I won't clutter > the mail with. > > Anyway, it's best presented with a set of examples and code. > > Re points 1 and 2 above, exact same code, except red is showAndWait() and > green is show(): > > <image.png> > > Obviously, they should behave the same. Then slightly resize the red one: > > <image.png> > > > Examples 3 and 4 above -- again, same code. Purple is show(), yellow is > showAndWait(). > > <image.png> > > After you close the yellow dialog: > > <image.png> > > They should be the same size from the outset. > > > > public class DialogBug extends Dialog<Boolean> { > > public DialogBug(final String s, boolean flip) { > setTitle("Bug"); > setResizable(true); > > final DialogPane dp = getDialogPane(); > dp.setStyle(s); > dp.getButtonTypes().add(ButtonType.CLOSE); > dp.setContent(new Label("Content")); > > // Setting stage size causes the bug > setOnShown(e -> { > > if (flip) { > // Set stage sizes > Stage st = (Stage) dp.getScene().getWindow(); > st.setMinHeight(260); > st.setMinWidth(360); > } else { > // Set dialog sizes: note buttons disappear when you resize > dp.setMinHeight(260); > dp.setMinWidth(360); > } > }); > } > > public static class BugApp extends Application { > @Override > public void start(final Stage st) throws Exception { > > final boolean FLIP_ME = true; // make true for other bug > > if (FLIP_ME) { > // Note: bug doesn't happen when using show() only. Stage > is fully green on show. > new DialogBug("-fx-background-color: green;", > true).show(); // NO BUG > > // showAndWait presents the bug; background not fully > drawn, button shifts on re-size > new DialogBug("-fx-background-color: red;", > true).showAndWait(); // BUG > } else { > // A different type of issue: two different sizes and > button behaviour > // Notice: > // - same dialogs, different sizes > // - how button in purple dialog shifts when yellow dialog > pane is closed > new DialogBug("-fx-background-color: purple;", > false).show(); // BUG > > new DialogBug("-fx-background-color: yellow;", > false).showAndWait(); // NO BUG > } > } > } > } > > Thoughts? > > > > Kind Regards, > Cormac > > >