Добавление MouseOverHandler к элементу? - PullRequest
9 голосов
/ 18 мая 2009

Я бы хотел послушать событие наведения мыши в GWT 1.6. С тех пор как в GWT 1.6 появились обработчики и устаревшие слушатели, я не уверен, как мне добиться этого с помощью небольшого количества информации.

Примечание: у меня есть объект Element. Это то, что мне нужно добавить обработчик мыши. Я прошу прощения за отсутствие ясности.

Спасибо!

Ответы [ 4 ]

19 голосов
/ 19 мая 2009

Я надеялся, что мы увидим ответ, прежде чем мне самому придется заняться этим. В приведенном им примере кода есть некоторые ошибки, но сообщение Марка Реноуфа в этой теме содержит большую часть того, что нам нужно.

Допустим, вы хотите прослушивать события наведения мыши и наведения мыши на пользовательском виджете. В своем виджете добавьте два метода:

public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
  return addDomHandler(handler, MouseOverEvent.getType());
}

public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
  return addDomHandler(handler, MouseOutEvent.getType());
}

Затем создайте класс обработчика:

public class MyMouseEventHandler implements MouseOverHandler, MouseOutHandler {
  public void onMouseOver(final MouseOverEvent moe) {
    Widget widget = (Widget) moe.getSource();
    widget.addStyleName("my-mouse-over");
  }

  public void onMouseOut(final MouseOutEvent moe) {
    Widget widget = (Widget) moe.getSource();
    widget.removeStyleName("my-mouse-over");
  }
}

Наконец, добавьте обработчик в виджет:

myWidget.addMouseOverHandler(new MyMouseEventHandler());
myWidget.addMouseOutHandler(new MyMouseEventHandler());

Если вы слушаете только указатель мыши, вы можете пропустить обработку мыши. И если вы не создаете пользовательский виджет, у виджета уже есть метод для добавления обработчика.

Наконец, согласно предупреждению из потока, не забудьте addDomHandler для событий мыши, а не addHandler.

2 голосов
/ 19 мая 2009

Вы хотели бы реализовать эти интерфейсы в своем классе:

  • HasMouseOverHandlers
  • HasMouseOutHandlers
  • MouseOverHandler
  • MouseOutHandler

MouseOverEvent запускается, когда мышь входит в элемент, а MouseOutEvent запускается, когда он больше не заканчивается.

HasMouseOverHandler реализован так:

public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
    return addDomHandler(handler, MouseOverEvent.getType());
}

HasMouseOutHandler реализован так:

public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
    return addDomHandler(handler, MouseOutEvent.getType());
}

После этого вы просто обрабатываете события с помощью MouseOverHandler и MouseOutHandler, после этого все должно быть довольно просто.

Если вы хотите добавить EventHandler к элементу, который уже существует в HTML, единственная идея, которая мне пришла в голову, - это создание класса-оболочки. Это полностью не проверено.

class ElementWrapper extends UIObject implements HasMouseOverHandlers, 
HasMouseOutHandlers
{
     public ElementWrapper(Element theElement)
     {
        setElement(theElement);
     }   

    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
        return addDomHandler(handler, MouseOutEvent.getType());
    }

    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
        return addDomHandler(handler, MouseOverEvent.getType());
    }
}

Тогда вы можете получить существующий элемент из HTML и инициализировать так:

onModuleLoad()
{
    Element theElement = RootPanel().get("elementID");
    ElementWrapper wrapper = new ElementWrapper(theElement);
    wrapper.addMouseOverHandler(new myHandler());

}

Надеюсь, это поможет.

1 голос
/ 11 декабря 2009

Если вы знаете тип элемента, вы можете обернуть элемент и получить соответствующий виджет обратно. В случае, скажем, изображения:

Element el = DOM.getElementById("someImageOnThePage");
Image i = Image.wrap(el);
i.addMouseOverHandler(...);

Единственная проблема, с которой я столкнулся, это то, что вы получите AssertionError в HostedMode, если элемент уже присоединен к другому родительскому виджету. Это будет хорошо работать в производстве, однако. Вероятно, есть веская причина для такого утверждения, поэтому будьте осторожны.

0 голосов
/ 12 мая 2010

Если вы знаете тип объекта, некоторые виджеты включают функцию статического переноса. От одного из них мне удалось вывести следующий класс.

public class Widget extends com.google.gwt.user.client.ui.Widget
{
    public Widget(Element element, boolean detatchFromDom)
    {
        super();
        if (detatchFromDom)
            element.removeFromParent();

        setElement(element);

        if (!detatchFromDom)
        {
            onAttach();
            RootPanel.detachOnWindowClose(this);
        }
    }

    public <H extends EventHandler> HandlerRegistration addDomHandlerPub(final H handler, DomEvent.Type<H> type)
    {
        return addDomHandler(handler, type);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...