RFR: 8353599: TabPaneSkin: add 'menuGraphicFactory' property [v2]
Andy Goryachev
angorya at openjdk.org
Thu Apr 17 16:43:37 UTC 2025
> Tries to address the mystery of missing graphic in the TabPane overflow menu.
> For a quick tester, use https://bugs.openjdk.org/secure/attachment/114240/TabPaneGraphicFactoryExample.java
>
> # 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 genera...
Andy Goryachev has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:
- popup menu on demand
- Merge remote-tracking branch 'origin/master' into 8353599.menu.factory
- Merge remote-tracking branch 'origin/master' into 8353599.menu.factory
- javadoc
- Merge remote-tracking branch 'origin/master' into 8353599.menu.factory
- graphic factory
-------------
Changes:
- all: https://git.openjdk.org/jfx/pull/1773/files
- new: https://git.openjdk.org/jfx/pull/1773/files/e50a550a..7cb4fa8e
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jfx&pr=1773&range=01
- incr: https://webrevs.openjdk.org/?repo=jfx&pr=1773&range=00-01
Stats: 472 lines in 15 files changed: 162 ins; 173 del; 137 mod
Patch: https://git.openjdk.org/jfx/pull/1773.diff
Fetch: git fetch https://git.openjdk.org/jfx.git pull/1773/head:pull/1773
PR: https://git.openjdk.org/jfx/pull/1773
More information about the openjfx-dev
mailing list