2009-05-18 18 views
9

Me gustaría escuchar el evento del mouse sobre GWT 1.6. Dado que GWT 1.6 ha introducido controladores y detectores obsoletos, no estoy seguro de cómo puedo lograr esto con la poca información que existe.Agregar un MouseOverHandler a un elemento?

Nota: Tengo un objeto Element. A eso es a lo que necesito agregar el controlador de mouse. Me disculpo por mi falta de claridad.

Gracias!

+0

¿Has echado un vistazo al ElementWrapper sugerido a continuación? – hannson

Respuesta

19

Tenía la esperanza de que veríamos una respuesta antes de tener que abordar esto yo mismo. Hay algunos errores en el código de ejemplo que publicó, pero el post by Mark Renouf in this thread tiene la mayoría de lo que necesitamos.

Digamos que desea escuchar los eventos de mouse over y mouse out en un widget personalizado. En el widget, añadir dos métodos:

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

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

continuación, crear una clase de controlador:

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

Por último, agregar el controlador para el widget:

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

Si sólo están escuchando el evento mouse over, puede omitir el manejo del mouse out. Y si no está haciendo un widget personalizado, el widget ya tiene un método para agregar el controlador.

Finalmente, según la advertencia de la secuencia, recuerde que para los eventos del mouse addDomHandler, no addHandler.

+1

No tengo claro cómo puedo usar esto con un objeto Element? No tengo un widget, tengo un elemento. Gracias por tomarse el tiempo para responder sin embargo. –

2

Lo que quiere implementar estas interfaces en su clase:

  • HasMouseOverHandlers
  • HasMouseOutHandlers
  • mouseOverHandler
  • mouseOutHandler

MouseOverEvent se activa cuando el ratón entra en el elemento y MouseOutEvent se activa cuando ya no está terminado.

HasMouseOverHandler se implementa como esto:

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

HasMouseOutHandler se implementa como esto:

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

Después de que acaba de controlar los eventos con un mouseOverHandler y mouseOutHandler, debe ser bastante directo después de eso.

Si desea agregar un manejador de eventos a un elemento que ya existe en el código HTML, la única idea que se me ocurre es crear una clase contenedora. Esto no se ha probado por completo.

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

entonces se podría obtener un elemento existente del HTML e inicializar así:

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

} 

Espero que esto ayude.

+1

Esto no funcionó para mí. Creo que es porque la mayoría de los widgets realizan más configuraciones cuando se registran con el DOM. Mi solución http://stackoverflow.com/questions/879349/adding-a-mouseoverhandler-to-an-element/1885631#1885631 consistía en utilizar un método de envoltura de Widget concreto (elemento) existente. Pero tenía que saber el tipo de elemento de antemano. Por cierto, quería extender Widget, que tiene addDomHandler(), no UIObject. – Bluu

1

Si conoce el tipo de elemento, puede envolver el elemento y recuperar el widget adecuado. En el caso de, por ejemplo, una imagen:

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

El único problema con esto que he encontrado es que obtendrá un AssertionError en HostedMode si el elemento ya está unido a otro widget padre. Sin embargo, funcionará bien en la producción. Probablemente haya una buena razón para esa afirmación, así que ten cuidado.

0

Si conoce el tipo de objeto, algunos widgets incluyen una función de envoltura estática. De uno de ellos pude derivar la siguiente clase.

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); 
    } 
} 
Cuestiones relacionadas