RFR: 8313424: JavaFX controls in the title bar [v12]

Andy Goryachev angorya at openjdk.org
Mon Oct 28 18:07:41 UTC 2024


On Mon, 28 Oct 2024 17:36:33 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> This PR is a new take on a highly requested feature: JavaFX controls in the header bar (see also #594 for an earlier iteration).
>> 
>> This is a feature with many possible ways to skin the cat, and it has taken quite a bit of effort to come up with a good user model. In contrast to the previous iteration, the focus has shifted from providing an entirely undecorated window to providing a window with a user-configurable header bar.
>> 
>> The customizable header bar is a new layout container: `javafx.scene.layout.HeaderBar`. It has three areas that accept child nodes: leading, center, and trailing.  `HeaderBar` also automatically adjusts for the placement of the default window buttons (minimize, maximize, close) on the left or right side of the window.
>> 
>> The customizable header bar is combined with a new `EXTENDED` stage style, which extends the client area into the header bar area. The new extended stage style is supported on Windows, macOS, and Linux. For platforms that don't support this stage style, it automatically downgrades to `DECORATED`.
>> 
>> This is how it looks like on each of the three operating systems:
>> 
>> ![extendedwindow](https://github.com/user-attachments/assets/9d798af6-09f4-4337-8210-6eae91079d3a)
>> 
>> The window buttons (minimize, maximize, close) are provided by JavaFX, not by the application developer. This makes it easier to get basic window functionality without recreating the entirety of the window controls for all platforms.
>> 
>> ## Usage
>> This is a minimal example that uses a custom header bar with a `TextField` in the center area. `HeaderBar` is usually placed in the top area of a `BorderPane` root container:
>> 
>> public class MyApp extends Application {
>>     @Override
>>     public void start(Stage stage) {
>>         var headerBar = new HeaderBar();
>>         headerBar.setCenter(new TextField());
>> 
>>         var root = new BorderPane();
>>         root.setTop(headerBar);
>> 
>>         stage.setScene(new Scene(root));
>>         stage.initStyle(StageStyle.EXTENDED);
>>         stage.show();
>>     }
>> }
>> 
>> To learn more about the details of the API, refer to the documentation of `StageStyle.EXTENDED` and `HeaderBar`.
>> 
>> ## Platform integration
>> The implementation varies per platform, and ranges from pretty easy to quite involved:
>> 1. **macOS**: The window buttons are provided by macOS, we just leave an empty area where the window buttons will appear. The client area is extended to cover the entire window by setting the `NSW...
>
> Michael Strauß has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 13 additional commits since the last revision:
> 
>  - Merge branch 'master' into feature/extended-window
>  - remove unused code
>  - small code changes
>  - GTK: add system menu
>  - GTK: prevent resizing below window button size, fix crash
>  - Windows: custom context menu overrides system menu
>  - Windows: add system menu
>  - improve documentation
>  - Improve HeaderBar documentation
>  - Merge branch 'master' into feature/extended-window
>  - ... and 3 more: https://git.openjdk.org/jfx/compare/f4357022...d9c0fe2e

modules/javafx.graphics/src/main/java/javafx/stage/StageStyle.java line 83:

> 81:      * <p>
> 82:      * An extended window has the default window buttons (minimize, maximize, close), but no system-provided
> 83:      * draggable header bar. Applications need to provide their own header bar by placing the {@link HeaderBar}

this must be emphasized.

suggestion:  "Applications must provide their own header bar by placing a single instance of the {@link HeaderBar} at the top of the scene graph"

and may be explain why

"in order to avoid the platform decorations overlapping the scene nodes" or something to that effect.

what do you think?

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1605#discussion_r1819519529


More information about the openjfx-dev mailing list