2009-05-18 2 views
9

Vorrei ascoltare l'evento del mouse su GWT 1.6. Dal momento che GWT 1.6 ha introdotto gestori e ascoltatori deprecati non sono sicuro su come posso ottenere ciò con le poche informazioni disponibili.Aggiungere un oggetto MouseOverHandler a un elemento?

Nota: Ho un oggetto Element. Questo è quello di cui ho bisogno per aggiungere il gestore del mouse. Mi scuso per la mia mancanza di chiarezza.

Grazie!

+0

Avete controllato ElementWrapper suggerito di seguito? – hannson

risposta

19

Speravo che avremmo visto una risposta prima che avessi bisogno di affrontare me stesso. Ci sono alcuni errori nel codice di esempio che ha pubblicato, ma lo post by Mark Renouf in this thread ha la maggior parte di ciò di cui abbiamo bisogno.

Supponiamo di voler ascoltare gli eventi del mouse e del mouse su un widget personalizzato. Nel tuo widget, aggiungere due metodi:

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

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

quindi creare una classe del gestore:

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

Infine, aggiungere il gestore al widget:

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

Se sei solo ascoltando il mouse sopra l'evento, puoi saltare la gestione del mouse. E se non stai facendo un widget personalizzato, il mio widget ha già un metodo per aggiungere il gestore.

Infine, per l'avviso dalla discussione, ricordarsi di addDomHandler per gli eventi del mouse, non addHandler.

+1

Non mi è chiaro come posso usarlo con un oggetto Element? Non ho un widget, ho un elemento. Grazie per aver trovato il tempo di rispondere però. –

2

Che ci si vuole implementare queste interfacce nella tua classe:

  • HasMouseOverHandlers
  • HasMouseOutHandlers
  • mouseOverHandler
  • mouseOutHandler

MouseOverEvent viene attivato quando il mouse entra l'elemento e MouseOutEvent viene attivato quando non è più finito.

HasMouseOverHandler è implementata in questo modo:

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

HasMouseOutHandler è implementata in questo modo:

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

Dopo di che basta gestire gli eventi con un mouseOverHandler e mouseOutHandler, dovrebbe essere abbastanza semplice dopo.

Se si desidera aggiungere un EventHandler a un elemento già esistente nell'HTML, l'unica idea che ho creato è la creazione di una classe wrapper. Questo è completamente non testato.

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

allora si potrebbe ottenere un elemento esistente dal codice HTML e inizializzare in questo modo:

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

} 

Spero che questo aiuti.

+1

Questo non ha funzionato per me. Penso che sia perché la maggior parte dei widget eseguono più setup quando si registrano con il DOM. La mia soluzione http://stackoverflow.com/questions/879349/adding-a-mouseoverhandler-to-an-element/1885631#1885631 prevedeva l'utilizzo di un metodo esistente (concreto) Widget's wrap (Element). Ma prima dovevo conoscere il tipo di elemento. A proposito, si voleva estendere il widget, che ha addDomHandler(), non UIObject. – Bluu

1

Se si conosce il tipo di elemento, è possibile avvolgere l'elemento e recuperare il widget appropriato. Nel caso, ad esempio, di un'immagine:

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

L'unico problema con questo che ho incontrato è che si otterrà un AssertionError nel HostedMode se l'elemento è già collegato a un altro widget genitore. Funzionerà comunque bene in produzione. Probabilmente c'è una buona ragione per questa affermazione, quindi fai attenzione.

0

Se si conosce il tipo di oggetto alcuni widget includono una funzione di avvolgimento statico. Da uno di loro sono riuscito a ricavare la seguente classe.

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