2010-04-06 7 views
6

estoy escribiendo un widget con el siguiente marcado:GWT UiHandler en HTMLPanel

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

Así que, esencialmente un div que envuelve e imagen y una etiqueta. Ahora, en lugar de agregar los controladores de eventos en la imagen/tramo, me gustaría que onClick esté asociado con HTMLPanel. Mi problema sin embargo es que GWT me dice que

shortcutPanel no no tiene un método asociado addClickHandler

Así que estoy asumiendo la diferencia es que no implementa HTMLPanel HasClickHandlers o algo por el que se línea. Me pregunto, entonces, ¿cuál es la forma estándar de adjuntar un manejador de clics a un elemento Ui como HTMLPanel o incluso mejor? ¿Existe un Widget GWT que sea esencialmente un contenedor div al que pueda adjuntar eventos fácilmente con @UiHandler? anotación.

Respuesta

20

Usted probablemente está buscando FocusPanel - que tiene todas las ventajas: HasAllFocusHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasBlurHandlers, HasClickHandlers .... por nombrar unos pocos :) Me parece que es la manera más fácil y mejor para adjuntar manejadores de clics a un Panel.

+4

Eso funcionó ¡Gracias! Tuve que modificar mi marcado para tener un FlowPanel directamente debajo del FocusPanel que envuelve la etiqueta y la imagen, ya que FlowPanel es un SimplePanel y solo puede tener un widget. Aparte de eso, funcionó como un encanto.Mi único problema es que produce un margen extra e innecesario que no me gusta, pero pronto me doy cuenta de que a la gente no parece importarle eso en el mundo de GWT. – brad

7

no he hecho esto antes, pero se puede hacer lo siguiente:

  • Crear una clase personalizada MyPanel que se extiende HTMLPanel e implementa HasClickHandlers
  • añade el siguiente método en MyPanel.java
public HandlerRegistration addClickHandler(ClickHandler handler) { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
  • Luego reemplace HTMLPanel con MyPanel en su ui.xml y su implementación de Java correspondiente.

Siempre puede consultar la implementación de HTMLTable para comprender cómo funciona la propagación de eventos. Es un Panel e implementa HasClickHandlers.

+0

fresco gracias, voy a tratar que cuando tengo la oportunidad – brad

2

excelente, funciona.

public class LiPanel extends HTMLPanel implements HasClickHandlers { 

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

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

} 
1

Si desea utilizar la anotación @UiHandler para registrar controladores de eventos para su widget personalizado, es necesario volver a aplicar los métodos addXXHandler. El compilador GWT no parece encontrar aquellos en las superclases. p.ej. Si desea utilizar

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

y su CustomWidget extiende una clase para la que esto está funcionando, es posible que tenga que añadir la interfaz HasSelectionHandlers explícitamente a su clase:

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