我有一个菜单管理器“menuManager”,它包含菜单项(动作)和一个子菜单,另一个菜单管理器“subMenu”包含更多动作。
final MenuManager subMenu = new MenuManager("Main",null);
subMenu.add(mActionClose);
MenuManager menuManager = new MenuManager("#PopupMenu", "contextMenu");
menuManager.add(action1);
menuManager.add(action2);
menuManager.add(subMenu);
我只能在动作上设置setEnabled(false)而不能在menumanager上设置。
答案 0 :(得分:1)
覆盖MenuManager
的isEnabled()
方法没有任何效果。您可以做的是访问相关的MenuItem
并尝试禁用它。
首先,您将IMenuListener
添加到“上下文菜单”管理器,以访问相关的Menu
:
public void menuAboutToShow(IMenuManager manager) {
manager.getMenu().addListener(SWT.Show, showContextMenuListener);
}
在监听器中,您会找到与您的子菜单管理器匹配的MenuItem
:
public void handleEvent(Event event) {
for (MenuItem item: ((Menu)event.widget).getItems())
//MenuItem data should be our MenuManager
if (item.getData().equals(subMenu)) {
//Disable the sub-menu item
item.setEnabled(false);
//Add listener to sub-menu (see comments below the code block)
item.getMenu().addListener(SWT.Show, showSubMenuListener);
}
}
这个问题是MenuManager
类中有一个错误修复代码,一旦点击它就会重新启用你的子菜单项(如果它包含任何项目)。要覆盖它,您还需要将SWT.Show
侦听器添加到子菜单,该子菜单将在单击后显示菜单时更新子菜单项的启用:
public void handleEvent(Event event) {
((Menu)event.widget).getParentItem().setEnabled(false);
}
答案 1 :(得分:1)
没有办法在jface MenuManager
上设置enabled == false,当我查看代码时,我在渲染过程中没有使用isEnabled()
看到它。我知道在大多数情况下,如果该菜单为空,它根本不会呈现子菜单。
在弹出菜单中,如果在SWT.Show
事件中它可以确定没有孩子,它将禁用子菜单,但我认为这种行为有点违反直觉。
一个不错的用户体验行为是总是在那里有子菜单,但是当它应该被使用时,它会扩展为一个禁用的菜单项:“< no actions available>”或“< not enabled>”或类似的东西。