On Thu, 8 Jan 2026 18:09:04 GMT, Andy Goryachev <[email protected]> wrote:
>> Tries to address the mystery of missing graphic in the TabPane overflow menu. >> >> ### Summary of Changes >> >> - minor `TabPaneSkin` constructor javadoc clarification >> - added the property >> - changed popup menu to be created on demand >> - removing adding the popup reference to the `TabHeaderSkin` properties (I >> think it was done for testing purposes, I could not find any references to >> it in the code) >> >> For a quick tester, use >> https://bugs.openjdk.org/secure/attachment/114240/TabPaneGraphicFactoryExample.java >> >> # Overflow Menu Graphic Property in the TabPaneSkin >> >> Andy Goryachev >> >> <[email protected]> >> >> >> ## 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 > ... > > 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 17 additional > commits since the last revision: > > - 2026 > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge remote-tracking branch 'origin/master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - Merge branch 'master' into 8353599.menu.factory > - ... and 7 more: https://git.openjdk.org/jfx/compare/6566d493...85a2926a > > But, can we fix on a behavior that if a graphic is set on a tab, then the > > same graphic would be used in overflow menu and a graphic from > > menuGraphicFactory will be neglected ? > > Good question! > > We can't, if the graphic set on a tab is some sort of a custom `Node` and not > the usual `ImageView` or `Label`. In this case, we can't easily clone that > custom graphic such that it appears in the tab **and** in the overflow menu. > > Ideally, the solution would be to replace setting the graphic on a tab with > setting a Supplier. This way the graphic can be supplied multiple times as > needed, but it would be a breaking change and something that is not needed in > 99.9% of the cases. WPF has [VisualBrush](https://learn.microsoft.com/en-us/dotnet/api/system.windows.media.visualbrush?view=windowsdesktop-10.0), which is like a JavaFX `Paint` that, instead of filling a shape with a color, fills it with the rendered representation of another node. Maybe there's something similar that could be done for JavaFX, which would make it easier to solve problems where a node in one part of the scene graph should be projected into another part of the scene graph. ------------- PR Comment: https://git.openjdk.org/jfx/pull/1773#issuecomment-3725605021
