begin process at 2008 08 20 13:59:34
1 228 858 membres
224 nouveaux aujourd'hui
14 257 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBSERVABLE DANS L'EDT (EVITE LE RECOURS À SWINGUTILITIES.INVOKE...)


Information sur la source

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

  • 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();
  • }
  • }
  • }
  • }
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.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

    Aucun commentaire pour le moment.

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS