Изменить местоположение всплывающего окна подменю GWT

В строке меню обычно подменю отображается справа. Хочу поменять на левый. Может кто-нибудь, пожалуйста, дайте мне знать, как я могу это сделать?


person PVR    schedule 28.03.2012    source источник


Ответы (4)


Расположение всплывающего окна подменю определяется элементами CSS при рендеринге на основе положения пунктов меню.

Глядя через Firebug в главное меню, он произвел:

element.style {
    clip: rect(auto, auto, auto, auto);
    left: 337px; // Change this to left:35px;
    overflow: visible;
    position: absolute;
    top: 319px;
    visibility: visible;
}

// This is main CSS for popup
.gwt-MenuBarPopup{
}

Итак, попробуйте, используя setStyleName("css goes here") из кода

person Hardik Mishra    schedule 29.03.2012
comment
Привет, Хардик, спасибо за быстрый ответ. Я сделал то же самое и достиг этого. - person PVR; 29.03.2012
comment
Вы действительно можете сделать addStyleName в группе меню ВНУТРИ всплывающего окна, но не в той, которая на самом деле является .gwt-MenuBarPopup. Поскольку всплывающее окно строки меню не создается до тех пор, пока оно не потребуется в ответ на действия пользователя (наведение курсора, щелчок), вы даже не можете стилизовать всплывающее окно по его индексу. Ни своим родителем, поскольку его DOM-контейнер вообще не имеет родителя. Мне еще предстоит найти способ сделать одну позицию всплывающего окна отличной от другой (скажем, последняя справа должна всплывать слева от исходного элемента). Похоже, что отсутствие возможностей выравнивания для класса MenuBar является серьезным упущением. - person eon; 04.04.2013

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

person Gleb    schedule 28.03.2012
comment
Я знаю, что это можно сделать только через это. Но не могли бы вы сказать мне, какие стили мне нужно переопределить? - person PVR; 28.03.2012
comment
Я открыл образец строки меню в firebug и увидел, что все элементы MenuBar имеют класс gwt-MenuItem в стиле CSS. Также каждый элемент имеет свой идентификатор, например, gwt-uid-1, gwt-uid-2 и так далее. Если вы хотите переопределить стиль элемента по умолчанию, подключитесь к главной странице, своему файлу CSS и напишите новые свойства для классов потребностей и идентификаторов. Советую подключить файл CSS в конец шапки раздела главной страницы после подключения GWT-скриптов, иначе изменение не сможет переопределить стили по умолчанию. Если хотите, могу по пунктам описать, как я это делал) - person Gleb; 28.03.2012

Я смог реализовать решение, изменив и css. Возможно, это не самый элегантный способ, но он работает. Используя небольшую помощь метода GwtQuery close(), вот небольшой пример.

        menuBar.addAttachHandler(new AttachEvent.Handler() {            
        @Override
        public void onAttachOrDetach(AttachEvent event) {
            if(event.isAttached()){
                Scheduler.get().scheduleDeferred(new ScheduledCommand() {                       
                    @Override
                    public void execute() {
                        Element e = $(menuBar).closest(".gwt-MenuBarPopup").get(0);
                        e.getStyle().setLeft(parentMenuBar.getAbsoluteLeft()-menuBar.getOffsetWidth() , Unit.PX);
                    }
                });                 
            }
        }
    });

Таким образом, идея заключается в том, что когда дочернее подменю прикреплено, вы хотите изменить файл css. Я использую отложенную команду, чтобы она изменила CSS после того, как реализация MenuBar по умолчанию GWT установит его. Эта строка "$(menuBar).closest(".gwt-MenuBarPopup").get(0);" будет искать дерево DOM, пока не найдет элемент с классом .gwt-MenuBarPopup, который вы хотите изменить.

person Will    schedule 24.09.2014

Мое решение представляет собой своего рода гибрид тех, что были опубликованы до сих пор здесь, но я думаю, что оно чище/проще, чем любое из них.

  1. Каждое вертикальное подменю само по себе является MenuBar, добавленным как элемент к верхнему уровню MenuBar. Для любого подменю, которое вы хотите переместить влево, а не вправо, добавьте к нему имя класса стиля, используя .addStyleName("myLeftDropDownStyleName") на этом MenuBar виджете.

  2. Определите правило селектора для этого стиля следующим образом (это минимальные атрибуты, которые были необходимы мне, чтобы получить левое удаление):

    .myLeftDropDownStyleName{ position: absolute; right: 0px; }

Абсолютные позиции относительно первого родительского элемента с позицией, отличной от статической; по крайней мере, в моем случае эта родительская позиция казалась горизонтальной, где выпадающий список в противном случае имеет левый край без этого решения. Я не удивлюсь, если Относительное положение может работать лучше в некоторых случаях других людей.

Смещение по правому краю, равное 0px, говорит, что абсолютное право положения должно находиться в том горизонтальном месте, о котором я упоминал выше. И, конечно же, размер пикселя может быть > 0, чтобы сдвинуть его влево на столько же, или даже ‹ 0, чтобы сдвинуть его вправо на столько же.

Это отлично работает для меня, просто и понятно, и не заставляет все ваши MenuBar иметь этот стиль (как я думаю, было бы в случае, если вы сами переопределили один из стилей MenuBar GWT).

person cellepo    schedule 13.11.2014