RFR: 8313424: JavaFX controls in the title bar [v21]
Michael Strauß
mstrauss at openjdk.org
Tue Nov 5 21:51:39 UTC 2024
On Tue, 5 Nov 2024 21:22:06 GMT, Andy Goryachev <angorya at openjdk.org> wrote:
>> We need to think of this in terms of the user model. `HeaderBar` gives rise to three named areas (leading, center, trailing) and comes with a certain layout behavior for each of those areas.
>>
>> Sure, it is possible to place another layout container in the `HeaderBar.center` area and set its prefWidth to infinity in order to effectively get rid of all of the custom layout behavior that `HeaderBar` brings to the table.
>>
>> But that severely limits application and library developers from customizing the user model of the header bar. For example, using `HeaderBarBase`, a library developer can create alternative header bars with a different set of features and a different user model. Those alternative header bars might have different layout areas, different properties, in short a different API. It would be really awkward to shoehorn all of that into the (opinionated) API of `HeaderBar`.
>
> I understand that, but could you give a **specific** example?
>
> There is nothing in HB that prevents it from being used in all the scenarios I can think of. It's like BorderPane - it can be used with a single center component, top and center, etc. I just don't think we need a separate base class in this particular case, unless something in the HB **_prevents_** it.
`BorderPane` is a good example. It's a customized API on top of `Pane`, which is basically just defined as a "collection of children":
> Base class for layout panes which need to expose the children list as public
> so that users of the subclass can freely add/remove children.
You're arguing that you wouldn't need `Pane` as a base class, because you can just as easily build a `VBox` on top of a `BorderPane` if you only use the center area and ignore all of the rest. While that's true, it's not a good user model.
I already gave you a specific example (Spotify) where an alternative implementation would dynamically change alignments, and presumably have a different API because of that.
As another example, take a look at what our WinUI friends are doing with their [TitleBar](https://github.com/microsoft/microsoft-ui-xaml/issues/9700). They have more API elements than our implementation (a back button, pane toggle button, icon, title, subtitle, and so on). The point of this example is _not_ to argue whether JavaFX developers could recreate this specific API by subclassing `HeaderBar`, it is to argue that custom APIs are relevant, and only `HeaderBarBase` gives developers a clean slate to create their own API.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1605#discussion_r1830044746
More information about the openjfx-dev
mailing list