Добавление MouseOverHandler к элементу?

Есть способ, но я использовал другой редактор. Sublime позволяет вам выбрать несколько областей, выделив одну и нажав CTRL + D, затем вы получите много курсоров и сможете редактировать их параллельно.

9
задан 3 revs, 2 users 100% 19 May 2009 в 14:53
поделиться

4 ответа

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

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

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 .

19
ответ дан 4 December 2019 в 09:38
поделиться

You'd want to implement these interfaces in your class:

  • HasMouseOverHandlers
  • HasMouseOutHandlers
  • MouseOverHandler
  • MouseOutHandler

MouseOverEvent is fired when the mouse enters the element, and MouseOutEvent is fired when it's no longer over.

HasMouseOverHandler is implemented like this:

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

HasMouseOutHandler is implemented like this:

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

After that you just handle the events with a MouseOverHandler and MouseOutHandler, should be pretty straightforward after that.

If you want to add an EventHandler to an Element that already exists in the HTML the only idea I've come up with is creating a wrapper class. This is completely untested.

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());
    }
}

Then you could get an existing Element from the HTML and initialize like this:

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

}

Hope this helps.

2
ответ дан 4 December 2019 в 09:38
поделиться

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

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

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

1
ответ дан 4 December 2019 в 09:38
поделиться

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

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);
    }
}
0
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: