2011-11-09 39 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