禁用Jface menumanager(灰色)

时间:2011-11-09 09:08:36

标签: java eclipse-plugin jface

我有一个菜单管理器“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上设置。

2 个答案:

答案 0 :(得分:1)

覆盖MenuManagerisEnabled()方法没有任何效果。您可以做的是访问相关的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>”或类似的东西。