> 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.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 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