RFR: 8313424: JavaFX controls in the title bar [v71]
Cormac Redmond
duke at openjdk.org
Sat May 3 22:24:00 UTC 2025
On Fri, 2 May 2025 10:32:42 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:
>> Implementation of [`StageStyle.EXTENDED`](https://gist.github.com/mstr2/0befc541ee7297b6db2865cc5e4dbd09).
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
>
> simplify header area picking
I was testing the HeaderBar, and noticed the styles of the windows buttons were sometimes not applied, or were getting stuck in a particular state (i.e., hover state). I thought I tracked this down to a benign issue where my app was applying duplicate stylesheets, in quick succession (i.e., twice) -- it should not matter usually, at all, but for some reason affected the window decoration icons in particular.
I fixed that edge-case issue. However, I then quickly noticed the styling will stop being applied after using a common controlsfx notification popup. It can be very easily reproduced:
package com.certak.kafkio.gui;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HeaderBar;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.controlsfx.control.Notifications;
import java.time.LocalDateTime;
public class WindowDecorationsStylesGoMissing extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.initStyle(StageStyle.EXTENDED);
BorderPane borderPane = new BorderPane();
borderPane.setTop(new HeaderBar());
Button click = new Button("Click");
click.setOnAction(event -> {
notify("Clicked at: " + LocalDateTime.now(), primaryStage);
});
borderPane.setCenter(click);
Scene scene = new Scene(borderPane, 400, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
public void notify(String message, Stage mainWindow) {
Notifications.create()
.text(message)
.owner(mainWindow)
.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run this, click the button and hover over the window icons, and see that no styling is applied anymore. I have not dived into this yet to understand _why_, but I know from memory that controlsfx does some re-arranging of nodes in scene usually.
Either way, the styling of HeaderBar seems quite unreliable/brittle given the various ways it can seemingly break. I don't know why, or what makes it different. But the other styles in my app appear unaffected by application bugs and/or quirks of controlsfx.
-------------
PR Comment: https://git.openjdk.org/jfx/pull/1605#issuecomment-2848834102
More information about the openjfx-dev
mailing list