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 :

Swing, EDT, et rafraichissement


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut Swing, EDT, et rafraichissement
    Bonjour à tous!

    J'ai réalisé une interface graphique pour un programme de dépouillement qui permet de visualiser un certains nombres de paramètres capteurs (sous forme "graphique", cadran et autre, ou stats via jFreeChart) et une partie vidéo. Je précise que je l'ai réalisé sans connaître l'existence de l'EDT et de SwingWorker, ce qui fait que je me retrouve avec une interface "complète" et pas optimisé (voilà c'est dit). Alors plutôt que de déballer mes problèmes d'un coup, je vais essayer de les exposer au fur et à mesure (merci d'avance à ceux qui auront le courage de suivre cette discussion qui risque de durer..)

    Donc..Problème n°1

    Afin de laisser liberté à l'utilisateur de choisir son agencement, j'ai défini une JFrame qui contient un JPanel qui contient 2 JPanel, fenetreDeGauche et fenetreDeDroite. L'utilisateur peut choisir de "switcher" suivant le schéma suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    graphique et video => par defaut
    graphique et stats
    video et stats
    etc... (il y a impossiblité d'avoir deux mêmes visu en même temps)
    LE problème c'estr que lors du changement par exemple de celui de gauche, il y a un temps de latence pendans lequel le panel de gauche est décalé vers le haut (sur la barre de menu), celui de droite est totu gris, et puis au bout de qqes secondes tout revient dans l'ordre. Il y a d'autres erreurs possibles comme des"traces" du Panel précédent etc...

    Voici le code de changement de Panel:
    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
     
    public void changementFenetre(String a,int b, int c){
     
    		final String cote=a;
    		final int precedent=b;
    		final int nouveau=c;
    		 	  if(cote.compareTo("droite")==0){
    		      			fenetreDroite.remove(ecrans[precedent]);
    		      			fenetreDroite.add(ecrans[nouveau]);
    		      			fenetreDroite.revalidate();
    		      		}
    		      		else{
    		      			fenetreGauche.remove(ecrans[precedent]);
    		      			fenetreGauche.add(ecrans[nouveau]);
    		      			fenetreGauche.revalidate();
    		      		}
     
     
    		      		repaint();
    			System.out.println("Changement effectué");
    	}
    Sachant que ecrans est tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this.ecrans[1]=this.tableauDeBord;
    this.ecrans[2]=this.getJPanelVideo();
    this.ecrans[0]=this.getTableauDeStatistiques();
    //ce sont tous des JPanel
    Voilà, j'espère que mon problème est clair...
    Merci

  2. #2
    Membre expérimenté
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Par défaut
    Si a partir de ton thread utilisateur tu as besoin de modifier des element graphique (maj de bouton ...) il faut que tu utilise la méthode static SwingUtilities.invokeLater(Runnable).

    Si tu a des opération tres long a mettre en oeuvre, utilise un swingWorker c super plus pratique....

    ex de swingUtilities :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    //ici tu met ce que tu veux faire sur les composants 
    textArea.setText(text);
    }
    });
    Pour résumer soit :
    1 - effectue tes opération longue dans un thread a part et fait des appel a InvokeLater pour la recnstruction de la GUI se qui evitera les freeze...
    2 - Creé un swingWorker dans lequel tu surcharge la méthode doInBackground() tu y fait toutes les choses longue dont tu as besoin tu tu appel le swingWorker avec SwingUtilities.invokeLater(new TonSwingWorker()).

    Voila j'espere avoir ete assez clair...

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Ben j'avais fait ca:

    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
     
     
    public void changementFenetre(String a,int b, int c){
     
    		final String cote=a;
    		final int precedent=b;
    		final int nouveau=c;
    		new Thread(new Runnable() {
     
    		      public void run() {
    		    	  if(cote.compareTo("droite")==0){
    		      			fenetreDroite.remove(ecrans[precedent]);
    		      			fenetreDroite.add(ecrans[nouveau]);
    		      			fenetreDroite.revalidate();
    		      		}
    		      		else{
    		      			fenetreGauche.remove(ecrans[precedent]);
    		      			fenetreGauche.add(ecrans[nouveau]);
    		      			fenetreGauche.revalidate();
    		      		}
    		       SwingUtilities.invokeLater(new Runnable() {
    		          public void run() {
     
     
    		      		repaint();
    		          }
    		        });
    		      }
    		  }).start();
     
     
     
    		System.out.println("Changement effectué");
    	}
    Mais le problème ne se résolvait pas pour autant...
    Je suis pas sûr d'avoir bien compris comment identifier ce qui doit être exécuté dans l'EDT et ce qui doit se faire en dehors..

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Flophx
    Je suis pas sûr d'avoir bien compris comment identifier ce qui doit être exécuté dans l'EDT et ce qui doit se faire en dehors..
    Tout ce qui touche aux composants doit être exécuté dans l'EDT, et tout le reste devrait être exécuté en dehors...


    Donc dans ton cas la méthode changementFenetre() doit être exécutée dans l'EDT (tu peux vérifié si c'est bien le cas avec SwingUtilities.isEventDispatchThread()).

    a++

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Bien, j'ai tout mis dans l'EDT:
    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
     
    public void changementFenetre(String a,int b, int c){
     
    		final String cote=a;
    		final int precedent=b;
    		final int nouveau=c;
    		new Thread(new Runnable() {
     
    		      public void run() {
    		    	  SwingUtilities.invokeLater(new Runnable() {
    		          public void run() {
     
    		        	  if(cote.compareTo("droite")==0){
    			      			fenetreDroite.remove(ecrans[precedent]);
    			      			fenetreDroite.add(ecrans[nouveau]);
    			      			fenetreDroite.revalidate();
    			      		}
    			      		else{
    			      			fenetreGauche.remove(ecrans[precedent]);
    			      			fenetreGauche.add(ecrans[nouveau]);
    			      			fenetreGauche.revalidate();
    			      		}
    		      		repaint();
    		          }
    		        });
    		      }
    		  }).start();
     
     
     
    		System.out.println("Changement effectué");
    	}
    Mais j'ai toujours les problèmes d'artefacts visuels restants du précédent Panel et le panel nouveau passe un temps au dessus de la barre de menu...
    Ex:
    Images attachées Images attachées  

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Ce que je ne comprends pas, c'est pourquoi il s'obstine à se rafraichir sur la barre de menu alors qu'il a les coordonnées exactes de rafraichissement (j'utilise un Layout(null) et setBounds())...

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 17h51
  2. Swing, EDT, menu non bloquant
    Par visiwi dans le forum EDT/SwingWorker
    Réponses: 7
    Dernier message: 01/06/2008, 22h36
  3. Swing et l'EDT
    Par zulkifli dans le forum EDT/SwingWorker
    Réponses: 6
    Dernier message: 11/10/2007, 20h14
  4. [SWING] Problème de rafraichissement
    Par david71 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/05/2004, 16h38

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