On Fri, 31 Jul 2026 19:59:46 GMT, Marius Hanl <[email protected]> wrote:
> `PopupWindow` will always overwrite its `Scene` (user agent) stylesheets when > an owner was set and `show` is called. > Code like this: > > > final Popup popup = new Popup(); > popup.getScene().setUserAgentStylesheet(popupUserAgentStylesheet); > popup.getScene().getStylesheets().add(popupStylesheet); > > > will do nothing, because your added stylesheets will be later overwritten > when `show` is called. > Andy and I were already wondering about this behavior two years ago: > https://github.com/openjdk/jfx/pull/1394#discussion_r1617620949 > > --- > > I can't see any reason why we should do that. Instead, this PR will only add > the stylesheets of the owner if they do not exist already. > Additionally, we will not overwrite the user agent stylesheet if it was > already set. > > Added tests for all combinations I can think of. This PR also fixes NPEs that > can happen when the owner window has no 'root window'. > > There is already a test for the `Cursor` behavior, but there was none that > verifies that the `Cursor` is not overwritten, so added one as well. > > https://github.com/openjdk/jfx/blob/05a7b6d0db5e799395da27ab43a93d4337001e11/modules/javafx.graphics/src/main/java/javafx/stage/PopupWindow.java#L479-L481 > > Now, we will never overwrite anything that the developer set (before > `show`ing). And as we can see above, this was already done this way with the > `Cursor`. > > > --------- > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai). modules/javafx.graphics/src/main/java/javafx/stage/PopupWindow.java line 521: > 519: Scene scene = getScene(); > 520: if (scene.getUserAgentStylesheet() == null && > ownerScene.getUserAgentStylesheet() != null) { > 521: > scene.setUserAgentStylesheet(ownerScene.getUserAgentStylesheet()); there might be another issue: - owner A has the user agent stylesheet A.css - a popup with no stylesheet is shown with the owner A. A.css is shown - the popup gets hidden - either owner A changes the stylesheet to B.css, or the popup is reusing with a different owner - the popup gets shown since `scene.getUserAgentStylesheet()` is already A.css, this code does not set the new stylesheet, leaving the popup with a wrong style. I know reusing the popup (context menu, etc.) is a bad idea, but surprisingly, I saw this happen many times in the past. modules/javafx.graphics/src/main/java/javafx/stage/PopupWindow.java line 527: > 525: for (String stylesheet : ownerScene.getStylesheets()) { > 526: if (!scene.getStylesheets().contains(stylesheet)) { > 527: newStylesheets.add(stylesheet); can a PopupWindow be reused? if so, the stylesheets might accumulate from the earlier cycles. is this ok? should we keep track of the stylesheets added here and remove them on `hide()`? ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/2236#discussion_r3716253994 PR Review Comment: https://git.openjdk.org/jfx/pull/2236#discussion_r3715444548
