[GWT] Возможно ли выбрать menuItem onMouseOver? - PullRequest
1 голос
/ 10 ноября 2011

Я понимаю веб-приложение, которое запускает команды, отображаемые в menuItem. Эти команды могут зависеть друг от друга, например, если команда C зависит от B, B зависит от A, чтобы выполнить C, мы должны выполнить ее в порядке A-> B-> C. Короче говоря, я хотел бы улучшить обратную связь с моим приложение и выберите menuItems автоматически, когда мышь находится над командой, которая зависит от них. Заранее спасибо за вашу помощь. Примечание: я использую GWT 2.3

Ответы [ 3 ]

2 голосов
/ 25 марта 2013

У меня была та же проблема, и вот решение этой надоедливой проблемы. Когда вы посмотрите на класс MenuBar, вы увидите, что события обрабатываются для каждого элемента MenuItem в строке меню. Единственное, что нужно сделать, это переопределить метод public void onBrowserEvent(Event event) в панели меню и найти элемент, получивший событие:

menu = new MenuBar(true) {
        @Override
        public void onBrowserEvent(Event event) {
            MenuItem currentItem = null;
            for (MenuItem item : itemList) {
                if (DOM.isOrHasChild(item.getElement(), DOM.eventGetTarget(event))) {
                    //MenuItem found here
                    currentItem = item;
                }
            }
            switch (DOM.eventGetType(event)) {
            case Event.ONMOUSEOVER:
                if (currentItem != null) {
                    // DO WHAT YOU GOTTA DO HERE
                }
                break;              
            }
            super.onBrowserEvent(event);
        }
    };

Вы также можете создать пользовательский элемент MenuItem для привязки к нему другой информации.

2 голосов
/ 12 ноября 2011

К сожалению, это невозможно с помощью методов, предоставляемых gwt.MenuItem является прямым подклассом UiObject, это тот же суперкласс, Widget наследуемый от, но MenuItem не является виджетом.Проблема в том, что все функции событий определены в Widget, а не в UiObject.

Вы можете попытаться создать класс com.google.gwt.user.client.ui.MenuItem в своем собственном проекте, тем самым «переопределив» класс gwt, пусть он наследуется отВиджет, скопируйте оригинальный MenuItem в и реализуйте необходимые интерфейсы.Я бы не рекомендовал это, хотя.Мне почти стыдно даже упоминать об этом.Более элегантным решением было бы создание класса MyMenuItem в вашем собственном пакете.Скопируйте в него содержимое MenuItem, но позвольте ему наследовать от Widget.Затем вы используете правило переплета в вашем .gwt.xml, чтобы заменить MenuItem на MyMenuItem.Просто не забудьте скопировать MenuItem снова при изменении версии GWT.

В качестве альтернативы, вы можете переопределить MenuItem и добавить свои собственные функции обработки событий.Вы можете посмотреть на Widget и его подклассы (TextField, Button ...), чтобы увидеть, как это должно быть сделано.Хорошее место для начала было бы Widget#addDomHandler.Это не так сложно, как кажется - грязная работа скрыта в классе DOM GWT, который также используется классом Widget.В основном это копирование / вставка.Недостаток в том, что ваш класс может больше не работать, если вы хотите использовать новую версию GWT и его нужно переписать.

Лично я бы не реализовал такой выбор как мгновенный эффект наведения мыши.Это звучит хорошо для новых пользователей, но как опытный пользователь, я был бы раздражен.обычно пункты меню сгруппированы на экране, поэтому, когда я хочу определенный элемент меню, в большинстве случаев приходится также навести курсор мыши на другие элементы.что приводит к миганию пунктов меню - раздражает, особенно когда я уже сотню раз делал это и знал зависимости команд.Могу ли я рекомендовать объединить это с таймером, чтобы зависимости выбирались через определенное время, например, 500 мс?опытные пользователи нажимают достаточно быстро, чтобы не беспокоиться об этом, а новые пользователи могут - при необходимости - немного подождать, чтобы получить дополнительную помощь.

О, и если вы действительно хотите это сделать, наведение курсора недовольно.Вы также должны прослушивать события фокусировки - многие пользователи используют свою клавиатуру для навигации, которая не попадает при наведении мыши, но запускает события фокусировки.

1 голос
/ 04 апреля 2014

Вот более простое решение по сравнению с предыдущим - просто используйте метод setAutoOpen(true) на вашем MenuBar ( Docs ).Тогда все дочерние меню откроются, когда пользователь наведет на них курсор мыши.

...