У меня была такая же проблема. Щелчок правой кнопкой мыши, а также верхнее меню с точно таким же (сложным) набором пунктов меню. Класс 'Action' - это то, что нужно учитывать, если вы говорите о вариантах включения, но он не имеет отношения к видимости, и в моем случае был также динамический список записей, основанный на текущем выборе, который я хотел использовать повторно.
Итак, я реализовал шаблон проектирования «Мост» (я думаю) для методов, которые я на самом деле использую (add () и 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);
}
}
Итак, я могу написать метод многократного использования, который вычисляет пункты меню и синхронизирует мой щелчок правой кнопкой мыши с меню верхнего уровня:
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();
}});