Observable dans l'edt (evite le recours à swingutilities.invoke...)

Description

Ce code utilise un classe dérivée de Observable qui notifie dans l'EDT pour une restitution fidèle dans l'interface graphique de l'état d'une tâche dans un autre thread.

Source / Exemple :


package patterns;

import java.lang.reflect.InvocationTargetException;
import java.util.*;
import javax.swing.SwingUtilities;

public class SwingObservable extends Observable{

    public SwingObservable(){
	super();
    }
    public void setChanged(){
	super.setChanged();	    
    }
    @Override
    public void notifyObservers() {
	SwingObservable.super.notifyObservers();
    }
    @Override
    public void notifyObservers(Object obj) {
	SwingObservable.super.notifyObservers(obj);
    }
    
    public void notifier(Object obj){
	setChanged();
	if (SwingUtilities.isEventDispatchThread()){
	    notifyObservers(obj);
	}
	else {
	    try {
		SwingUtilities.invokeAndWait(new RunParametre(obj){
		    public void run(){
			notifyObservers(arg);
		    }
		});
	    } catch (InterruptedException e) {
		// TODO Bloc catch auto-généré
		e.printStackTrace();
	    } catch (InvocationTargetException e) {
		// TODO Bloc catch auto-généré
		e.printStackTrace();
	    }

	}
    }

}

Conclusion :


La classe de test dans le zip lance un thread qui boucle 2000 fois et envoie une notification à l'interface graphique qui est Observer.
Avec la classe SwingObervable, on a progressivité de l'affichage, et avec la classe NONSwingObservable, le traitement va plus vite, mais l'interface n'affiche pas toutes les valeurs (ça saute).Pour faire les deux tests, il suffit de décommenter la déclaration qu'on veut garder du l'objet notificateur.
La classe permet d'éviter le recours à des systematiques SwingUtilities.invokeAndWait qui sont codés dans la classe SwingObservable.
La classe RunParametre permet de passer un parametre au Thread anonyme appelé dans SwingObservable.
Il y a un Bug au deuxieme lancement, comme si le thread était déjà lancé, vos solutions seront les bienvenues.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.