IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

Pb de rafraichissement graphique dans une japplet


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut Pb de rafraichissement graphique dans une japplet
    Bonjour,

    J'ai écrit une petite applet pour piloter des simulations.
    La simulation tourne dans un thread, et les résultats s'affichent en temps réel dans l'applet. Le panneau de l'applet contient aussi une barre de boutons pour piloter la simulation (run/pause).

    J'ai essayé de respecter les principes de l'EDT mais manifestement c'est raté puisque lorsque je resize la fenêtre de l'applet, il arrive que la barre de boutons disparaisse.

    Voilà le code de l'applet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public class Laboratory extends JApplet {
     
    	/** simulation */
    	private Simulation simulation;
     
    	/** buttonBar */
    	private ButtonBar buttonBar;
     
    	/** a flag that indicates whether or not the simulation is paused */
    	private boolean pause =true;
     
    	/**
             * Initializes the applet.
             */
    	public void init() {
    		simulation = new Simulation(this) ;
    		try {
    			javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
    				public void run() {
    					buttonBar = new ButtonBar(Laboratory.this) ;
    					Laboratory.this.getContentPane().add( buttonBar, "South" );
    					Laboratory.this.getContentPane().add( simulation.getNewJTabbedPane() );
    				}
    			});
    		} catch (Exception e) {
    			System.err.println("createGUI didn't successfully complete");
    			throw new RuntimeException();
    			}
    		pause(true);
    		simulation.start();
    	}
     
    	/**
             * @return a flag that indicates whether or not the applet is paused.
             */
    	public boolean isPaused() {
    		return this.pause;
    	}
     
    	/**
             * @param b a boolean.
             */
    	void pause(boolean b) {
    		this.pause =b;
    		this.buttonBar.setPause(b);
    	}
     
    }
    et voilà le code de la methode run() de la simulation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    	/**
             * Runs the simulation.
             */
    	public void run() {
    		while (true) {
    			if (!laboratory.isPaused()) {
    				model = new ModelState(model);
    				SwingUtilities.invokeLater(new Runnable(){
    					public void run(){
    						matrixPane.setText(model.getBalanceSheetMatrix());
    						consoleText.append(model.toString()+"\n");
    					}
    				});
    				try { Thread.sleep(50); } 
    				catch (InterruptedException e) {}
    			}
    			else try { Thread.sleep(250); } 
    			catch (InterruptedException e) {}
    		}
    	}
    Votre aide sera la bienvenue.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Remplace l'appel à invokeAndWait de l'init de ta JApplet par un invokeLater.

    Le reste semble bon si ce n'est le fait qu'il faut toujours au moins afficher la stacktrace des exceptions dans les block catch (ou encore mieux avoir un système de logging en bonne et due forme...).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    Merci, j'ai fait ce que tu dis, mais les problèmes subsistent:
    http://sep.free.fr/test2/

    Le seul moyen que la barre de boutons s'affiche correctement après un resize c'est de ralentir la simulation mais c'est dommage, je ne comprends pas ce qui coince.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    En fait je crois comprendre ce qui se passe.
    La simulation est très rapide et les taches graphiques s'empilent dans l'EDT qui n'arrive pas à les traiter au même rythme.

    Quand arrive une tache de rafraîchissement de la fenêtre lié à un resize elle s'empile derrière toutes ces tâches et doit attendre qu'elles soient traitées. C'est pourquoi la barre de bouton n'est pas redessinée immédiatement.

    Je vois alors deux solutions : ou je ralentis la simulation pour qu'elle laisse le temps à l'EDT de faire le job, ou je cherche à alléger les tâches de rafraîchissement, par exemple en ne provoquant de mise à jour que toutes les 10 boucles de la simulation par exemple, ou en ne mettant à jour que le contenu de l'onglet visible.

    Et il n'y a pas moyen de faire passer les tâches de rafraîchissement liées au resize au début de la pile, de façon à ce qu'elles soient traitées en priorité ?

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La question étant, as tu vraiment besoin de mettre à jour ton JTextField et ta JTextArea toutes les 50ms. A priori l'utilisateur ne le verra pas plus que si tu le fais toutes les 250ms.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    Tu as un peu raison, mais en fait la simulation est tellement rapide qu'on pourrait à la limite se passer de mise à jour et afficher les résultats directement, une seconde ou deux après le lancement de l'applet.

    Seulement l'applet a surtout une fonction de démonstration, il faut un peu de suspens...
    Ainsi rafraîchir l'affichage après chaque période du modèle permet d'afficher chacune des matrices dans l'onglet correspondant, et donc l'utilisateur peut vérifier que les contraintes que cette matrice exprime sont toujours vérifiées tout au long de la simulation.

    Ce que j'ai fait finalement c'est d'utiliser invoqueAndWait() à la place de invoqueLater() pour la mise à jour du contenu.
    Donc la simulation attend que le rafraîchissement du contenu soit effectif avant d'opérer l'itération suivante du modèle.

    Le résultat me paraît satisfaisant: http://sep.free.fr/test3/

Discussions similaires

  1. inserer graphique dans une cellule
    Par veer2006 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2007, 16h08
  2. [ImageMagick] Comment mettre plus qu'un graphique dans une page ?
    Par 12_darte_12 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 29/06/2006, 20h30
  3. [VBA-E] Création Graphique dans une boucle
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/06/2006, 10h32
  4. Réponses: 1
    Dernier message: 24/04/2006, 16h16
  5. [MFC] Intégration d'un graphique dans une mfc
    Par Nergaahl dans le forum MFC
    Réponses: 1
    Dernier message: 22/03/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo