我有一个带有弹出菜单的应用程序。我想以通常的方式使用弹出窗口(即,它应该在用户右键单击窗口中的任意位置时出现),但我也想将它附加到窗口顶部的主菜单栏。我不知道该怎么做。
我认为它就像调用 myJMenuBar.add(myPopupMenu) 一样简单,但这不起作用。
JMenuBar.add() 需要一个 JMenu 参数,而不是一个 JPopupMenu。
有没有人有什么建议?
我有一个带有弹出菜单的应用程序。我想以通常的方式使用弹出窗口(即,它应该在用户右键单击窗口中的任意位置时出现),但我也想将它附加到窗口顶部的主菜单栏。我不知道该怎么做。
我认为它就像调用 myJMenuBar.add(myPopupMenu) 一样简单,但这不起作用。
JMenuBar.add() 需要一个 JMenu 参数,而不是一个 JPopupMenu。
有没有人有什么建议?
最好的方法不是尝试重用JPopupMenu
对象,而是封装菜单执行的操作,然后重用它们。弹出窗口将触发这些操作,菜单项也是如此。
从Action
JavaDoc:
除了 ActionListener 接口定义的 actionPerformed 方法之外,该接口还允许应用程序在一个地方定义:
- 一个或多个描述函数的文本字符串。例如,这些字符串可用于显示按钮的浮动文本或设置菜单项中的文本。
- 一个或多个描述功能的图标。这些图标可用于菜单控件中的图像,或用于更复杂的用户界面中的复合条目。
- 功能的启用/禁用状态。应用程序可以禁用实现此接口的功能,而不必单独禁用菜单项和工具栏按钮。所有注册为状态更改侦听器的组件然后知道禁用该项目的事件生成并相应地修改显示。
和
JPopupMenu
,JToolBar
并且JMenu
都提供了方便的方法来创建组件并在相应的组件上设置 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();
}});