#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. Я не думаю, что отключение только элементов удобно для пользователя… Я могу сделать трюк: удалить подменю, заменить его каким-нибудь фиктивным обычным элементом (с тем же заголовком) и отключить его, но мне это не очень нравится.