Отключение менеджера меню Jface (выделено серым) - PullRequest
1 голос
/ 09 ноября 2011

У меня есть менеджер меню «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) только для действий, а не для менеджера меню.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Нет способа установить enabled == false на jface MenuManager, и когда я просматривал код, я не видел его, используя isEnabled() во время его рендеринга. Я знаю, что в большинстве случаев оно просто не отображает подменю, если это меню пустое.

Во всплывающих меню это отключит подменю, если на событии SWT.Show он может определить, что нет дочерних элементов, но я думаю, что поведение немного нелогично.

Приличное UX-поведение заключается в том, чтобы всегда иметь это подменю, но развернуть его до одного отключенного пункта меню, когда его следует использовать: «<нет доступных действий>» или «<не включен>» или что-то в этом роде.

1 голос
/ 09 ноября 2011

Переопределение 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);
}
...