我有一个包含菜单项(操作)的菜单管理器“ 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上设置。

最佳答案

覆盖isEnabled()MenuManager方法没有任何作用。您可以做的是访问相关的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);
}

09-10 12:56