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