On Fri, 11 Apr 2025 18:17:59 GMT, Andy Goryachev <ango...@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.goryac...@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

Reply via email to