> 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 
> `NSWindowStyleMaskFullSizeContentView` flag. A click-and-drag operation is 
> ini...

Michael Strauß has updated the pull request incrementally with two additional 
commits since the last revision:

 - improve title text documentation
 - macOS: hide window title

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

Changes:
  - all: https://git.openjdk.org/jfx/pull/1605/files
  - new: https://git.openjdk.org/jfx/pull/1605/files/d7f88c33..cd5d4434

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jfx&pr=1605&range=13
 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=1605&range=12-13

  Stats: 6 lines in 2 files changed: 6 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jfx/pull/1605.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1605/head:pull/1605

PR: https://git.openjdk.org/jfx/pull/1605

Reply via email to