Как добавить JPopupMenu в JMenuBar? - PullRequest
1 голос
/ 11 декабря 2010

У меня есть приложение с всплывающим меню. Я хотел бы использовать всплывающее окно обычным способом (то есть оно должно появляться, когда пользователь щелкает правой кнопкой мыши в любом месте окна), но я также хотел бы прикрепить его к главной панели меню вверху окна. Я не уверен, как это сделать.

Я думал, что это так же просто, как звонить myJMenuBar.add (myPopupMenu) но это не работает

JMenuBar.add () хочет параметр JMenu, а не JPopupMenu.

У кого-нибудь есть предложения?

Ответы [ 2 ]

0 голосов
/ 31 мая 2017

У меня была такая же проблема. Щелчок правой кнопкой мыши, а также верхнее меню с точно таким же (сложным) набором пунктов меню. Класс '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();
      }});
0 голосов
/ 11 декабря 2010

Вместо того, чтобы пытаться повторно использовать объект JPopupMenu, лучшим подходом будет инкапсуляция действий, которые выполняют меню, и их повторное использование.Всплывающее окно будет запускать эти действия, как и пункты меню.

Из Action JavaDoc :

В дополнение к методу actionPerformed, определенному интерфейсом ActionListener, этот интерфейс позволяет приложению определять водно место:

  • Одна или несколько текстовых строк, описывающих функцию.Эти строки можно использовать, например, для отображения текста перехода для кнопки или для установки текста в пункте меню.
  • Один или несколько значков, отображающих функцию.Эти значки можно использовать для изображений в элементе управления меню или для составных записей в более сложном пользовательском интерфейсе.
  • Состояние функциональности включено / отключено.Вместо того, чтобы отдельно отключать пункт меню и кнопку панели инструментов, приложение может отключить функцию, которая реализует этот интерфейс.Все компоненты, которые зарегистрированы как слушатели для изменения состояния, затем знают, что необходимо отключить генерацию событий для этого элемента и соответственно изменить отображение.

и

JPopupMenu, JToolBar и JMenu - все предоставляют удобные методы для создания компонента и установки Action для соответствующего компонента.Обратитесь к каждому из этих классов для получения дополнительной информации.

...