Can I add submenus to context or main menus, instead of single menu items?
Yes, any place where the APIs expect to have an item installed into a context or main menu, you can provide a submenu instead.
Provide a dummy Action
(it can be a do-nothing subclass of javax.swing.AbstractAction
), or in some cases the class need not even be an Action
at all. For context menus, implement the interface Presenter.Popup
on your Action
, and have it return a JMenu
from getPopupPresenter()
.
Similarly, you can implement other subinterfaces of Presenter
to provide a different component to display in toolbars or the main menu.
Note about using alternate components in the main menu: If you want your action to work properly on Mac OS, you probably don’t want to return anything other than a JMenu
or JMenuItem
from getMenuPresenter()
if you implement Presenter.Menu. In general, Swing allows you to treat menu popups as generic Swing containers you can put what you like into. This is not true at all of the Mac OS screen menu bar - it expects normal menu items, and will not handle unusual contents for menus.
If you just return a JMenu
from getPopupPresenter
or getMenuPresenter
it will always be displayed, though you can conditionally disable it. If you wish to sometimes hide (not just disable) the submenu, make it implement DynamicMenuContent and you can make the submenu appear or disappear whenever you like (or even provide more than one menu item / submenu).