Ich hatte das gleiche Problem. Ein Rechtsklick sowie ein Top-Menü mit genau der gleichen (komplizierten) Menge von Menüpunkten. Die 'Action'-Klasse sollte berücksichtigt werden, wenn Sie über Aktivierungsauswahl sprechen, aber es geht nicht um Sichtbarkeit, und in meinem Fall gab es auch eine dynamische Liste von Einträgen basierend auf einer aktuellen Auswahl, die ich wiederverwenden wollte.
So landete ich ein ‚Brücke‘ Entwurfsmuster Umsetzung bis (glaube ich) für die Methoden, die ich tatsächlich nutzen (add() und AddSeparator()):
public static class MenuBridge
{
private JPopupMenu popupMenu;
private JMenu menu;
public MenuBridge(JPopupMenu popupMenu)
{
this.popupMenu = popupMenu;
}
public MenuBridge(JMenu menu)
{
this.menu = menu;
}
public void addSeparator()
{
if(popupMenu!=null) popupMenu.addSeparator();
else menu.addSeparator();
}
public void add(JMenuItem item)
{
if(popupMenu!=null) popupMenu.add(item);
else menu.add(item);
}
}
So dann kann ich eine wiederverwendbare Methode schreiben das berechnet die Menüelemente und synchronisiert meinen rechten Mausklick mit dem Menü der obersten Ebene:
public void addTaskMenuItems(DefaultMenu menu, List<MDProcTask> taskList)
{
...
menu.add()/menu.addSeparator()
...
}
addTaskMenuItems(new DefaultMenu(popupMenu),taskList);
...
taskMenu.addMenuListener(new MenuListener() {
public void menuCanceled(MenuEvent menuevent)
{
}
public void menuDeselected(MenuEvent menuevent)
{
}
public void menuSelected(MenuEvent menuevent)
{
taskMenu.removeAll();
addTaskMenuItems(new DefaultMenu(taskMenu),getSelectedTasks());
taskMenu.revalidate();
}});