2011-11-09 41 views
1

我有一个菜单管理器“menuManager”,其中包含菜单项(操作)和子菜单,另一个菜单管理器“subMenu”包含更多的操作。禁用Jface菜单管理器(灰色)

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上设置setEnabled(false)。

回答

1

重写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); 
} 
+0

你测试过了吗? –

+0

我该怎么做? – kenny

+1

@TonnyMadsen你说得对,isEnabled()在那里是没用的方法... –

1

有没有办法设置启用==假的MenuManager,当我翻看代码时,我没有看到它在渲染过程中使用isEnabled()。我知道在大多数情况下,如果该菜单是空的,它不会呈现子菜单。

在弹出式菜单中,如果在SWT.Show事件中可以确定没有孩子,它将禁用子菜单,但我认为这种行为有点违反直觉。

体面UX行为是始终有子有,但有它扩展到一个禁用的菜单项时,应使用它:“可用> <没有动作”或“<未启用>”或类似的东西。

+0

我不认为禁用只是项目是用户友好的...我可以做一个技巧:删除子菜单,用一些虚拟的常规项目(具有相同的标题)取代它,并禁用它,但我不喜欢它很多。 – kenny