如何将JPopupMenu添加到JMenuBar?

时间:2010-12-11 02:34:04

标签: swing jpopupmenu jmenubar

我有一个带弹出菜单的应用程序。我想以通常的方式使用弹出窗口(即,当用户右键单击窗口中的任何位置时它应该出现),但我也想将它附加到窗口顶部的主MenuBar。我不知道该怎么做。

我认为这就像打电话一样简单     myJMenuBar.add(myPopupMenu) 但这不起作用。

JMenuBar.add()想要一个JMenu参数,而不是JPopupMenu。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:0)

最好的方法是封装菜单执行的操作,然后重用这些操作,而不是尝试重用JPopupMenu对象。弹出窗口将触发这些操作,菜单项也是如此。

来自Action JavaDoc

  

除了ActionListener接口定义的actionPerformed方法之外,该接口允许应用程序在一个地方定义:

     
      
  • 描述该功能的一个或多个文本字符串。例如,可以使用这些字符串显示按钮的悬浮文本或在菜单项中设置文本。
  •   
  • 描绘该功能的一个或多个图标。这些图标可用于菜单控件中的图像,也可用于更复杂的用户界面中的复合条目。
  •   
  • 功能的启用/禁用状态。应用程序可以禁用实现此接口的功能,而不必单独禁用菜单项和工具栏按钮。然后,所有注册为状态更改的侦听器的组件都知道禁用该项的事件生成并相应地修改显示。
  •   

  

JPopupMenuJToolBarJMenu都提供了方便的方法来创建组件并在相应的组件上设置Action。有关更多信息,请参阅这些类中的每一个。

答案 1 :(得分:0)

我有同样的问题。右键单击以及顶部菜单,其中包含完全相同(复杂)的菜单项集。如果您正在讨论启用选项,那么“Action”类是需要考虑的,但它不是处理可见性,在我的情况下,还有一个动态的条目列表,它基于我想要重用的当前选择。

所以我最终为我实际使用的方法(add()和addSeparator())实现了'Bridge'设计模式(我认为):

  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();
      }});