2010-12-11 46 views
1

我有一个弹出菜单的应用程序。我想以通常的方式使用弹出窗口(即当用户右键单击窗口中的任何位置时它应该出现),但我还想将它附加到窗口顶部的主菜单栏。我不知道如何做到这一点。如何添加JPopupMenu到JMenuBar?

我以为它就像调用 myJMenuBar.add(myPopupMenu) 一样简单,但这不起作用。

JMenuBar.add()需要JMenu参数,而不是JPopupMenu。

有没有人有任何建议?

回答

0

而不是尝试重新使用JPopupMenu对象,最好的方法是封装菜单执行的操作,并重用这些操作。弹出菜单会触发这些操作,菜单项也一样。

ActionJavaDoc

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

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

JPopupMenuJToolBarJMenu所有提供用于创建分量和设置相应的部件上的操作便利性的方法。请参阅每个类以获取更多信息。

0

我有同样的问题。右键单击以及顶层菜单与完全相同(复杂)的一组菜单项。如果您正在讨论启用选项,则需要考虑'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(); 
     }});