2010-11-23 14 views
5

Estoy trabajando en el desarrollo de un software simple de gráficos que debe implementarse tanto en swing como en gwt. En el lado de gwt, voy a usar gwt-g2d para el lienzo. Esperaba usar un eventbus en ambas implementaciones para simplificar parte del software.¿Cómo se usa SimpleEventBus o EventBus de GWT?

Mi opinión es que debe ser algo como esto:

  1. Instantiate EventBus
  2. Instantiate Padres Widget, hundir los eventos que desea para el EventBus (al pasar el ratón o RPC de devolución de llamada, por ejemplo)
  3. Establezca EventBus para escuchar eventos del Widget principal.
  4. Crear instancias de widgets secundarios, ¿quién debe registrar con EventBus los oyentes que tiene? (¿Necesitan registrar eventos que podrían desencadenar?)
  5. Cuando EventBus recibe un evento, debe tomar una decisión sobre el evento y luego actuar en esa decisión, ya sea que eso signifique ignorarlo, cambiar el tipo de evento o simplemente retransmitirlo a todos los widgets secundarios aplicables.

¿Es esto así en general, cómo debería funcionar? SimpleEventBus todavía es algo nuevo, y no puedo encontrar mucho en la web sobre cómo usarlo realmente.

Respuesta

2

Un SimpleEventBus proporciona la funcionalidad básica de almacenar una colección de controladores y llamar a event.dispatch() con todos los controladores relevantes cuando corresponda. No diría que "estableces EventBus para escuchar eventos" desde el widget principal. SimpleEventBus no tiene un concepto de "padre". En cambio, pasas una referencia a tu SimpleEventBus. Luego, cualquier objeto puede "desencadenar un evento" con el método SimpleEventBus.fireEvent. No hay jerarquía.

De forma similar, cualquier objeto puede escuchar esos eventos con SimpleEventBus.addHandler(). Esto es lo más cercano a su # 4 - addHandler toma un tipo de evento y un controlador, por lo que siempre que ese tipo de evento pase a fireEvent (por algo en su aplicación), ese controlador se pasará al evento. Tenga en cuenta que el Event es lo que llama al controlador, ¡NO al EventBus! EventBus simplemente llama a event.dispatch (theHandler), y el programador del evento es responsable de llamar a la función adecuada en el Handler. Su número 5 es inexacto, al menos para SimpleEventBus: SimpleEventBus no inspecciona los eventos en absoluto, excepto para ver a qué controladores llamar. No sabe sobre ningún widgets niño o cualquier lógica de la aplicación, y nunca cambia el tipo de un evento.

Su lógica para ver qué región fue elegida no sería apropiada en un EventBus; en cambio, haría un controlador que haga la lógica y escuche en busca de ClickEvents. Entonces, ese controlador podría decirle a la región seleccionada que se seleccionó directamente, o podría crear su propio evento RegionSelectionEvent que podría disparar a lo largo de un EventBus, y luego se podría informar a todas las regiones que se ha producido una RegionSelection, y su registrador podría obtener una notificación, o el monitor de su servidor podría recibir la notificación y notificar al jefe que alguien seleccionó una región, o lo que sea.Si solo necesita anular la selección de una región y seleccionar otra, un eventbus es excesivo.

Por otro lado, algo así como un evento de "cambio de tamaño" tiene mucho sentido, ya que todos sus widgets pueden necesitar saber al respecto.

0

Según entiendo el GWT EventBus, está destinado a eventos que abarcan toda la aplicación (piénsese en "propiedad de todo el sistema y propiedad x chanded y"; cualquier cosa que escuche ese evento en particular puede actuar sobre ella). Esto te ayuda a separar la lógica de tu aplicación.

Probablemente no desee desencadenar ningún evento de IU: los widgets principales pueden implementar los controladores o simplemente puede usar instancias anónimas.

+0

Pensé que parte del encanto de esto era que facilitaba los casos de prueba automatizados usando la inyección de eventos de IU. De todos modos, la razón por la que intenté hacer esto fue porque un lienzo podría tener 4 regiones de gráficos, y esas regiones podrían tener 4 objetos gráficos colocados el uno sobre el otro. Si hago clic en un objeto de gráfico, necesito ejecutar un poco de lógica para ver cuál fue seleccionado, porque un punto puede superponerse. Mis eventos personalizados iban a ser cosas como cambiar el tamaño, nuevos datos, nueva ventana de datos, nueva escala, etc. ... – Brian

+0

Estaba viendo EventBus a través de los ojos del MVP sugerido por los desarrolladores de GWT. Lo que hacen para probar la interfaz de usuario es resumirlo en vistas que pueden intercambiarse por dummies cuando se prueban. Su caso es algo diferente ya que probablemente tendrá un EventBus por lienzo que gestiona todos los eventos de lienzo. Todavía sugiero solo disparar tus propios eventos (cambiar el tamaño, rotar ...) que afectarían a muchos objetivos. –