2010-06-08 9 views
12

Puede ser una pregunta tonta, pero GWT FlowPanel (elemento div sin procesar) no proporciona algo para manejar un mouseclick/mousemovement en él. Anulación onBrowserEvent tampoco funciona.GWT: ¿Cuál es la forma de manejar Haga clic en GWT FlowPanel

Si se establece el evento onclick utilizando JavaScript nativo (es necesario especificar la altura positiva antes, 'div' tiene una altura de 0 si no se especifica), la captura de estos eventos funciona correctamente. ¿Hay alguna manera de hacerlo sin usar JSNI?

Respuesta

18

Lo que debe hacer aquí es ajustar su FlowPanel en un FocusPanel. Un FocusPanel contiene todos los controladores posibles y, por lo tanto, le permitirá tener un ClickHandler configurado.

Otro método sería crear su propio widget ampliando el panel de flujo e implementando la interfaz necesaria para poder contener un ClickHandler.

Yo personalmente recomendaría el primer método. Es más simple, más rápido de codificar y no ralentizará tu aplicación.

0

Parece una pregunta tonta, sí. FlowPanel se puede envolver o reemplazar fácilmente con FocusPanel, que proporciona una gran cantidad de métodos para monitorear/manejar eventos.

+0

Bueno, si entiendo FlowPanel y FocusPanel correctamente, no puede reemplazar FlowPanel por FocusPanel, pero sí puede ajustar un FlowPanel en un FocusPanel. – Zwik

+0

Sí, 'FocusPanel' es la implementación' SimplePanel', por lo que no puede contener más de un widget hijo. Pero si su 'FlowPanel' contiene solo uno, simplemente puede reemplazarlo con' FocusPanel' :). –

+2

Bueno, usar un FlowPanel para solo 1 niño sería inútil. – Zwik

8

En realidad, le vayan a hacer esto:

FlowPanel fPanel = new FlowPanel() { 
     @Override 
     public void onAttach() { 
      super.onAttach(); 
      super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance   
                   // of your ClickHandler 
     } 
} 

Saludos !!!

+1

Sí, es un poco hack-way pero si un usuario tiene restricciones con el uso de FlowPanel, este truco puede hacer un trabajo para él. Gracias –

+0

Si pudiera dar esta respuesta, múltiples votaciones ascendentes lo haría. – saihgala

5

Esto funcionó para mí (Obviamente, sustituir "SU clickHandler" con el nombre de su clickHandler):

FlowPanel field = new FlowPanel(); 

field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType()); 
6

La mejor solución que encontré para esto era here.

La idea es ampliar FlowPanel (o SimplePanel) para implementar las interfaces de controlador relevantes, que es una opción mucho más ordenada para situaciones donde no se requiere la funcionalidad completa y las capacidades de enfoque del FocusPanel. Ver más abajo:

public class MouseAwareFlowPanel extends FlowPanel implements 
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers 
{ 
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) 
    { 
     return addDomHandler(handler, MouseOverEvent.getType()); 
    } 
    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) 
    { 
     return addDomHandler(handler, MouseOutEvent.getType()); 
    } 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
} 
+0

¡Esta es también una buena solución para aquellos que no desean recibir todo tipo de eventos! ¡Gracias! –

0

Simplemente envuelva la FlowPanel con un FocusPanel, que dejará listo el widget para otra interacción del usuario también:

Fuente:

FlowPanel flowPanel = new FlowPanel(); 
    FocusPanel focusPanel = new FocusPanel(flowPanel); 
    focusPanel.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      Window.alert("Hi!"); 
     } 
    }); 
Cuestiones relacionadas