2010-04-06 13 views
6

Sto scrivendo un widget con il seguente markup:GWT UiHandler su HTMLPanel

<g:HTMLPanel ui:field="shortcutPanel" styleName="{style.shortcut}"> 
    <g:Image ui:field="shortcutImage"></g:Image> 
    <span ui:field="shortcutLabel"></span> 
</g:HTMLPanel> 

Quindi, in sostanza un div che avvolge e l'immagine e un'etichetta. Ora, invece di aggiungere i gestori di eventi all'immagine/span, vorrei che un onClick fosse associato a HTMLPanel. Il mio problema però è che GWT mi dice che

shortcutPanel non non ha un metodo di addClickHandler associato

Così sto assumendo la differenza è che HTMLPanel non implementa HasClickHandlers o qualcosa che linea. Mi chiedo quindi qual è il modo standard per collegare un gestore di clic a un elemento Ui come un HTMLPanel o anche meglio, c'è un tale GWT Widget che è essenzialmente un wrapper div in cui posso facilmente associare eventi a @UiHandler annotazione.

risposta

20

Probabilmente si sta cercando FocusPanel - ha tutte le chicche: HasAllFocusHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasBlurHandlers, HasClickHandlers .... per citarne alcuni :) Trovo che sia il modo più semplice e migliore per associare i gestori di clic a un pannello.

+4

Ha funzionato Grazie! Ho dovuto modificare il mio markup per avere un FlowPanel direttamente sotto il FocusPanel che avvolge l'etichetta e l'immagine, dal momento che FlowPanel è un SimplePanel e può avere solo un widget. A parte questo, ha funzionato come un fascino.Il mio unico problema è che produce un po 'di markup extra e non necessario di cui non sono un fan, ma mi sto rapidamente rendendo conto che le persone non sembrano interessarsene nel mondo GWT. – brad

7

non l'ho fatto prima, ma si potrebbe fare quanto segue:

  • Creare una classe personalizzata MyPanel che si estende HTMLPanel e implementa HasClickHandlers
  • aggiungere il seguente metodo in MyPanel.java
public HandlerRegistration addClickHandler(ClickHandler handler) { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
  • Quindi sostituire HTMLPanel con MyPanel nel tuo ui.xml e la sua corrispondente implementazione Java.

Si può sempre osservare l'implementazione di HTMLTable per capire come funziona la propagazione dell'evento. È un Panel e implementa HasClickHandlers.

+0

fresco grazie, ci proverò che quando ho una possibilità – brad

2

superbo, funziona.

public class LiPanel extends HTMLPanel implements HasClickHandlers { 

    LiPanel() { 
     super("li", ""); 
    } 

    @Override 
    public HandlerRegistration addClickHandler(ClickHandler handler) { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 

} 
1

Se si desidera utilizzare l'annotazione @UiHandler per registrare i gestori di eventi per il vostro widget personalizzato, è necessario ri-implementare i metodi addXXHandler. Il compilatore GWT non sembra trovare quelli nelle superclassi. per esempio. se si desidera utilizzare

@UiHandler("myCustomWidget") 
public void handleWidgetSelectionChangeEvent(final SelectionEvent<CountryDts> event) { 
... 
} 

e la tua CustomWidget estende una classe per cui questo sta lavorando, potrebbe essere necessario aggiungere l'interfaccia HasSelectionHandlers esplicitamente alla classe:

public class CustomComboBox<D> extends ComboBox<D> implements HasSelectionHandlers<D> { 

    @Override 
    @SuppressWarnings("pmd.UselessOverridingMethod") 
    public HandlerRegistration addSelectionHandler(final SelectionHandler<D> handler) { 
     // GWT Compile doesn't recognize method in supertype for UIHandler 
     return super.addSelectionHandler(handler); 
    } 
... 
}