2011-01-21 16 views
7

Actualmente estoy aprendiendo sobre Swing, y soy nuevo en el desarrollo de GUI en general. En mi aplicación de prueba, tengo múltiples listas de eventos para un solo origen de evento, y me pregunto cuál de estos oyentes del evento se ejecutará primero.Java Swing Multiple Event Listeners para un origen de evento único en un entorno de subproceso único

Además, tengo curiosidad por saber cómo oscilación de gestión de eventos trabaja en un entorno de un solo subproceso, sobre todo cuando se tienen varios oyentes de una sola fuente de eventos.

Por último, me gustaría saber algunos casos comunes donde tengo que usar múltiples hilos en Swing.

Gracias!

Respuesta

12

Intentaré responder a todas sus 3 preguntas. En primer lugar, el orden en que no se especifica el incendio de ActionListener s. Uno nunca debe asumir un orden específico que disparará. Si necesita que las acciones se realicen en un orden específico, colóquelas en el mismo ActionListener.

En la programación de Swing, que será 'casi' siempre en un entorno multi-hilo. Hay un hilo llamado Subproceso de envío de evento (EDT). Este es el hilo que maneja todos los eventos. Cualquier otro procesamiento que hagas debe hacerse en un hilo diferente, de lo contrario tu GUI de Swing puede dejar de responder.

Un caso común para varias roscas de oscilación es cualquier momento que tiene que hacer algún tipo de procesamiento que se lleva una cantidad de tiempo prolongado. (Cálculos intensos, IO, conexiones a la base de datos) Querrá hacer el arduo trabajo en un hilo separado del EDT. Eso mantendrá su GUI receptiva.

La red de Oracle tiene un gran tutorial sobre la concurrencia en Swing. Te recomiendo check it out.

un columpio programador trata de los siguientes tipos de hilos:

  • las discusiones iniciales, los hilos que ejecutan código de la aplicación inicial.
  • El hilo de envío de eventos, donde se ejecuta todo el código de manejo de eventos. La mayoría del código que interactúa con el marco Swing también debe ejecutarse en este hilo.
  • Subprocesos de trabajo, también conocidos como subprocesos de fondo, donde se ejecutan las tareas de fondo que consumen mucho tiempo.

La respuesta canónica a cualquier pregunta multi-threading en oscilación es utilizar un SwingWorker. Le permite coordinar fácilmente el trabajo de fondo en un hilo separado con el EDT. Como de costumbre, Oracle tiene un great tutorial on how to use SwingWorker.

+1

Extraño una mención directa de SwingWorker, pero por lo demás es una muy buena respuesta. – extraneon

+0

@extraneon: sí 'SwingWorker' es la respuesta canónica a multi-threading en Swing. Agregaré un rápido reconocimiento al final. – jjnguy

+2

Desde una perspectiva de diseño, es posible crear un ActionListener al que puede registrar otros ActionListeners (u otra clase) que pueden ejecutarse en el orden en que se establecen. – extraneon

Cuestiones relacionadas