[Gvsig_desarrolladores] setSelection desde un IMonitorableTask

César Martínez Izquierdo cesar.martinez en iver.es
Mar Mayo 15 08:57:33 CEST 2007


Alvaro Zabala wrote:
> Ahora mismo intuyo la causa, pero no la solución:
> 
> cuando visualizas la capa vectorial con el componente de GUI table, éste
> automáticamente se registra como listener de los eventos de selección
> del recordset de la capa, de forma que cuando cambie una selección ésta
> se refleje en el componente gráfico.
> 
> Ahora bien, como IMonitorableTask corre en un hilo aparte, cuando desde
> esta tarea tratas de cambiar la selección, el listener tratará de que
> esto se refleje en el componente de Swing....y me parece que los
> componentes Swing solo pueden ser accedidos desde el event-dispatcher
> thread.
> 
> De esto se habla en este enlace:
> http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html
> 
> No obstante, no tengo muy claro como esquivar este problema con el API
> de ITask de gvSIG....(que usa SwingWorker, pero una versión anterior a
> la del artículo).
> Habrá que investigarlo.
> 
> Un saludo.

Yo lo estuve investigando un día, pero no lo hemos probado todavía.
Basta con añadir un método finished() a la IMonitorableTask; añadir un
método abstracto del mismo nombre al SwingWorker:

public abstract void finished();

Y en las implementaciones del Worker, habría que hacer una llamada ocmo
esta:

public void finished() {
  task.finished():
}

Si bien tenemos varias implementaciones del Worker, y habría que ver
cómo encaja en cada una (algunas tienen varias tasks).

El método finished se llamara automáticamente *desde el Event Dispatch
Thread* al finalizar la BackgroundTask, así que evitaremos el problema
de Diego.

He subido en el HEAD unos cambios que reflejan esto, faltaría rellenar
correctamente el comportamiento en MonitorableDecorableMainFirst,
MonitorableTaskQueue y PipeTask; todos ellos implementan IMonitorableTask.

Saludos,


-- 
César Martínez Izquierdo
Equipo de desarrollo gvSIG
http://www.gvsig.gva.es

IVER T.I.
C/ Salamanca 50
46005 Valencia - Spain
http://www.iver.es


Más información sobre la lista de distribución gvSIG_desarrolladores