RFR: 8353599: TabPaneSkin: add 'menuGraphicFactory' property
Michael Strauß
mstrauss at openjdk.org
Wed Apr 16 19:24:49 UTC 2025
On Fri, 11 Apr 2025 18:17:59 GMT, Andy Goryachev <angorya at openjdk.org> wrote:
> Tries to address the mystery of missing graphic in the TabPane overflow menu:
>
> # Overflow Menu Graphic Property in the TabPaneSkin
>
> Andy Goryachev
>
> <andy.goryachev at oracle.com>
>
>
> ## Summary
>
> Introduce a `menuGraphicFactory` property in the `TabPaneSkin` class eliminates the current limitation of this skin
> in supporting menu item graphics other than an `ImageView` or `Label` with an `ImageView` graphic.
>
>
>
> ## Goals
>
> The goals of this proposal are:
>
> - to allow the application developers to customize the overflow menu items' graphic
> - retain the backward compatibility with the existing application code
> - clarify the behavior of the skin when the property is null (i.e. the current behavior)
>
>
>
> ## Non-Goals
>
> The following are not the goals of this proposal:
>
> - disable the overflow menu
> - configure overflow menu graphic property via CSS
> - add this property to the `TabPane` control itself
>
>
>
> ## Motivation
>
> The existing `TabPaneSkin` does not allow the overflow menu to show graphic other than
> an `ImageView` or `Label` with an `ImageView`.
>
> This limitation makes it impossible for the application developer to use other graphic Nodes,
> such as `Path` or `Canvas`, or in fact any other types. The situation becomes even more egregious
> when the tabs in the `TabPane` have no text.
>
> Example:
>
>
> public class TabPaneGraphicFactoryExample {
> public void example() {
> Tab tab1 = new Tab("Tab1");
> tab1.setGraphic(createGraphic(tab1));
>
> Tab tab2 = new Tab("Tab2");
> tab2.setGraphic(createGraphic(tab2));
>
> TabPane tabPane = new TabPane();
> tabPane.getTabs().addAll(tab1, tab2);
>
> TabPaneSkin skin = new TabPaneSkin(tabPane);
> // set overflow menu factory with the same method as was used to create the tabs
> skin.setMenuGraphicFactory(this::createGraphic);
> tabPane.setSkin(skin);
> }
>
> // creates graphic Nodes for tabs as well as the overflow menu
> private Node createGraphic(Tab tab) {
> switch (tab.getText()) {
> case "Tab1":
> return new Circle(10);
> case "Tab2":
> return new Canvas(10, 10);
> default:
> return null;
> }
> }
> }
>
>
>
> ## Description
>
> The proposed solution adds the `menuGraphicFactory` property in the `TabPaneSkin` class:
>
>
> /**
> * This property allows to control the graphic for the overflow menu items,
> * by generating graphic {@code Node}s when the menu is shown.
> * <p>
> * When this property is {@code null}, the...
It may be worth considering to have `TabPaneSkin.menuGraphicFactory` come with a default factory (instead of being `null` by default) that implements the current behavior, and then have `null` mean "I want no overflow menu". I think this would be cleaner than a `null` value implying a default factory.
-------------
PR Comment: https://git.openjdk.org/jfx/pull/1773#issuecomment-2810540457
More information about the openjfx-dev
mailing list