2012-03-23 11 views
8

Tener el siguiente szenario: desenfocar un cuadro de texto (entrada) escribe texto en mi cuadro de estado (en ciertas condiciones) y hacer clic en un botón también escribe texto en el cuadro de estado.GWT: ¿Cómo poner evento en la cola (equivalente a Swing invokeLater())?

Ahora, al hacer clic en el botón, se desenfocará mi cuadro de texto si está enfocado y eso hará que el cuadro de estado parpadee, ya que primero el objeto borrador escribirá su resultado y luego el comando clickHandler. Como quiero que aparezca el clickHandler, mi idea es dejar que blurHandler coloque un evento al final de la cola que compruebe si un clickHandler ha escrito un resultado antes.

En Swing probaría SwingUtilities .invokeLater (Runnable). Se dice que el equivalente en GWT es Scheduler, pero los comandos diferidos o finalmente parecen ejecutarse siempre después del evento actual y antes del siguiente. Hasta ahora utilizo Scheduler.scheduleFixedDelay con 100ms de retraso y espero que venga después del clickHanlder en cada navegador. Ver similares problem con la respuesta.

Creo que debe haber una mejor solución para esto. Cómo realmente agregar un evento al final de la cola o ¿es imposible debido a las limitaciones de HTML?

+0

Tenga en cuenta que su problema tiene * * nada que ver con HTML, pero con los motores de Javascript de diversas navegador. Scheduler agrega evento al final de la cola, pero el navegador puede generar el próximo evento una vez que se haya completado su evento. ¿Este efecto aparece en todos los navegadores? –

+0

sí, el efecto aparece en todos los navegadores –

+0

No estoy seguro de si esta es la mejor solución, pero en el desenfoque del cuadro de texto puede que tenga que ver si el foco fue al botón específico. No parece muy elegante. Quizás este enlace ayude: http://stackoverflow.com/questions/7096120/how-to-determine-where-focus-went – nogridbag

Respuesta

4

Probar:

Scheduler.get().scheduleDeferred(new Command() { 

         @Override 

         public void execute() { 
           ....... 
         } 
       }); 

Ver

Class Scheduler

+0

Ya lo intenté. Hacer esto en el blurHandler todavía hace que el comando se ejecute antes del clickHandler. Intenté esto en modo dev y producción en FF, Chrome, Safari, el mismo efecto de parpadeo en todos los navegadores. –