On Wed, 20 May 2026 18:36:47 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 `menuGraphicOverride` 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 `menuGraphicOverride` 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.setMenuGraphicOverride(this::createGraphic); >> tabPane.setSkin(skin); >> } >> >> // creates graphic Nodes for tabs as we... > > Andy Goryachev has updated the pull request incrementally with one additional > commit since the last revision: > > override I agree, allowing to fully customize the context menu is probably a better idea anyway. The problem with context menus in javafx is that they made the same mistake many people do in Swing: they think it's something that should be created early, or created and set to a property. A much better approach, in my opinion, is to create context menus upon request. In other words, instead of the `contextMenu` property in `Control`, `Tab`, `TableColumnBase` it should have been a `contextMenuSupplier` property. Of course it is possible to use the supplier, at the price of a little dance, see for instance https://github.com/andy-goryachev/MP3Player/blob/8b0ff12460e19850b783b961f214eacf5e1cdaf8/src/goryachev/fx/FX.java#L1251 I am going to set this PR back to Draft state to explore the alternative you suggested. Thanks! ------------- PR Comment: https://git.openjdk.org/jfx/pull/1773#issuecomment-4663153070
