Отключение Jface menumanager (выделено серым цветом)

#java #eclipse-plugin #jface

#java #eclipse-плагин #jface

Вопрос:

У меня есть menumanager «MenuManager», который содержит пункты меню (действия) и подменю, другое «Подменю» menumanager, которое содержит больше действий.

 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.

Ответ №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);
}
  

Комментарии:

1. @vanaprogeja, первая часть ответа хороша (голосую за), но я не хочу переопределять методы menumanager, просто слишком много беспорядка.

2. Должен ли я использовать прослушиватели, чтобы отключить его?

3. @kenny возможно, у вас нет ссылки на элемент до того, как он станет видимым, поэтому прослушиватель, вероятно, единственный выход. Я изменил свой ответ, чтобы избежать переопределения MenuManager.

Ответ №2:

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

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

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

Комментарии:

1. Я не думаю, что отключение только элементов удобно для пользователя… Я могу сделать трюк: удалить подменю, заменить его каким-нибудь фиктивным обычным элементом (с тем же заголовком) и отключить его, но мне это не очень нравится.