2010-12-11 3 views
1

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

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

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

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

ответ

0

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

От ActionJavaDoc:

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

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

и

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

0

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

Так что я в конечном итоге реализации шаблона «мост» дизайн (я думаю) для методов я использую (добавить() и 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(); 
     }}); 

 Смежные вопросы

  • Нет связанных вопросов^_^