Swing 如何将JPOppMenu添加到JMenuBar?

Swing 如何将JPOppMenu添加到JMenuBar?,swing,jpopupmenu,jmenubar,Swing,Jpopupmenu,Jmenubar,我有一个带有弹出菜单的应用程序。我希望以通常的方式使用弹出窗口(即,当用户右键单击窗口中的任何位置时,弹出窗口应该出现),但我也希望将其附加到窗口顶部的主菜单栏。我不知道该怎么做 我原以为这就像打电话一样简单 添加(myPopupMenu) 但这不起作用 add()需要一个jmenus参数,而不是一个jpopmpmenu 有人有什么建议吗?与其尝试重用jpopmpmenu对象,最好的方法是封装菜单执行的操作,然后重用这些操作。弹出窗口将触发这些操作,菜单项也是如此 从操作: 除了ActionLi

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

我原以为这就像打电话一样简单 添加(myPopupMenu) 但这不起作用

add()需要一个jmenus参数,而不是一个jpopmpmenu


有人有什么建议吗?

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

操作

除了ActionListener接口定义的actionPerformed方法外,此接口还允许应用程序在单个位置定义:

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

jpopmpmenu
JToolBar
JMenu
都提供了创建组件和在相应组件上设置操作的方便方法。有关更多信息,请参阅这些类别中的每一个


我也有同样的问题。鼠标右键单击以及顶部菜单,其中包含完全相同(复杂)的菜单项集。“Actudio”类是要考虑的,如果你在讨论启用选项,但它不是处理可视性,在我的例子中,还有一个基于我想要重用的当前选择的动态条目列表。 因此,我最终为我实际使用的方法(add()和addSeparator())实现了一个“桥接”设计模式(我认为):

因此,我可以编写一个可重用的方法来计算菜单项,并将鼠标右键单击与顶级菜单同步:

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();
      }});
public void addTaskMenuItems(默认菜单,列表任务列表)
{
...
menu.add()/menu.addSeparator()
...
}
addTaskMenuItems(新建默认菜单(弹出菜单)、任务列表);
...
taskMenu.addMenuListener(新的MenuListener(){
公共作废菜单已取消(菜单事件菜单事件)
{
}
已选择公共作废菜单(菜单事件菜单事件)
{
}
已选择公共无效菜单(菜单事件菜单事件)
{
taskMenu.removeAll();
addTaskMenuItems(新建默认菜单(taskMenu),getSelectedTasks());
taskMenu.revalidate();
}});
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();
      }});